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.11-cp314-cp314t-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.14tWindows x86-64

python_fcl-0.7.0.11-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.6 MB view details)

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

python_fcl-0.7.0.11-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14tmacOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

python_fcl-0.7.0.11-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (4.6 MB view details)

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

python_fcl-0.7.0.11-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

python_fcl-0.7.0.11-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.11-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

python_fcl-0.7.0.11-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.11-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

python_fcl-0.7.0.11-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.11-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

python_fcl-0.7.0.11-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.11-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp39-cp39-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9Windows x86-64

python_fcl-0.7.0.11-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.11-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

python_fcl-0.7.0.11-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.11-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 b3cda7c83b93ba9bd93b8e66826d0b646c590d4d5044a5051ae0ae960007d7eb
MD5 b2dca22ceed2ee56c95937332fc16360
BLAKE2b-256 bd823a2c164dc9b56bfbb8fc839fe36b03da44cd61a4a3145af144da0227d577

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2efc1769958c5da260d41adf7210cf2b02899637db30da419a7795c6db3ed8fd
MD5 4d48677b4552c3a38986b2c8e984722f
BLAKE2b-256 d9c20ac0fdbaf132b9c8b8c106268fe0780e7aa61dd30d4624a2a82af68974ee

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4b2881b6c85ca003d38d0d21d5fb9724860d006a158da57530644798f42bc11a
MD5 ae78e233242ed22c51c327c9ef83adcd
BLAKE2b-256 4b5219aa972ddebc55c2fccf92efb79358712ebad2f13d260cd1957c75539a8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a48312a0dcd8466e79be4b5025f52168d0e5b866b809f727923b313246989bc
MD5 98c4fb63b7a281ac71bfad527e2684c5
BLAKE2b-256 33a2d24131a06b32d91c9c33ea044fe85de339d06e6fc66360afd86916e004ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 41f4a7994b77abf8a373ff35ca46a3a31008e0fa2dd704fe4eb58d1ed1292367
MD5 c9e4da06006f1e2678a0a0ab458c98d2
BLAKE2b-256 1aecafdf105472c72cd745c18909b569ed584c42ce8ca901e67fa2ffbd7bcfa9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 1f811d6f742f535e55a8aa2cfcc7b93515b594941af1f7c288a9daab08fd4047
MD5 7f0b34190cb381060ec5ac0ca1a3c665
BLAKE2b-256 f1daff22c4298479d80e8a5966015b54df3539266373196b309a5717d746b86a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8b11738c65aec8e701070cd9990c378b977216f403927601c9029e140c8f8716
MD5 cf17bfaa1772d94c882b26de86d75b6a
BLAKE2b-256 eb8ea0c3dad4697e53c13dc048fc8687c35adcc6e8ac2193ef59371d341b9203

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 817c9e37d19190add42d93642ebeaa1488cc5bcdc06b10d34febe00e2347bec3
MD5 43b506e62267488a43e85d9175bd18e2
BLAKE2b-256 2a7d675bde8915578877f3d93a86390d828a2b0f92409f34d106f14f95a0e891

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5e763da82db0374780cbaba8e28414fde348263b7d8b8f7824a434de7e522f4f
MD5 524ad6d3cf2d4dbaed13aa8aeb39e28c
BLAKE2b-256 32eacbee164379e631a63a369d20c3e686fa63fd4f3b6c57765fbbf1dde5938e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 371a67585d92c3c9213b5e2eedd4804ef5b2e1a392e33ff1fc5438bd7f5df71a
MD5 01dca66351e1d9029339450e3b67cf23
BLAKE2b-256 e67426fc8dccb5cdbd89dc9f58986bfd55dd1d8757c5445e538c0d859ed8f2fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 136585069f547c303d9b7d7a3e9a63e0b03937279532cd3144c0f12c5ce853d2
MD5 9f284bbc3b2a69e274989be037948e20
BLAKE2b-256 a06937eda188d6fdd6003071d2f5a4e5270f492b2b59d2381f9e7ce69c8a1c2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7ae81c84ff19d7dc0cd3c1c7a7966c89ecbe7b3484942d278b5ec563cd5f0247
MD5 45f7c27e30f01f88eb58a28b17bba170
BLAKE2b-256 079230795d104114d9e7bd605eeeb35f117fbe3ed5c5bf626bfd47cd9a6c9ce1

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fcbc70c3e7e82a5baa9421d28e327951756520933182de2c47ccb24338277c28
MD5 f24b2169ca2bad11b7a0d4ae27be4064
BLAKE2b-256 ff088f97a4fc730de02cc20751cce3f0a6c416065824f0e3584de13b72972655

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb10b3037d82ef754ba236a94a7f12da1864e13d4bc2f0d1ae9078c9a814915f
MD5 f70c7389af5b34629dfef3fe7271de9e
BLAKE2b-256 ef9ff924d8e6e27ec82bffc5cbecb4e1cccf30411c177ca58adfb7ba147ef454

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4aeea7f27b25147a85cea120f0a4da317727848cf3153a44be404449426b8570
MD5 41ccae7db6cc27b9313132717e9baf23
BLAKE2b-256 af9f0d4d20bbb63618d8d9da96da870132d1c84c7489b49509f0eb9c7b54c16a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 63c662c8ff30eeb78913624a4ac56209a6061248ed97066c3b744255d943299f
MD5 4258d07a5361ba667a0dcdfadce2cc98
BLAKE2b-256 203d27bf74bbb5318ecb224c06697bbbb8bee98b43ab9db9d375b305da11301a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3ac7b02f47d7fb881e5786be8328da3c586af9b8c2f0eb07c4a3ed9342f810e2
MD5 79298ba33e8ba21bd17eec8324584e74
BLAKE2b-256 885df13c1c8eed4ce3b9e1f59c6dd31850540e575390cd85917a74afc027a3c0

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a69a007099d610d31290d7638750545c18c54b94c0cc1f0f420fc27740761f69
MD5 24d2a4302afd41f80f6b87b6a4e81f33
BLAKE2b-256 1777704a3bb182b59dbe26b9836c00ce2e53a3877a21a6e7dfbfc404ab1fefe1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 47238454103b8e5e66ca285aae84aa9c2386ae4fe3f2d392f1cbabe24bd69b1a
MD5 666bee78a17469e409457146dd9a2224
BLAKE2b-256 2bb9b3da9b16d6213db4d932dddc82282cb539d0d85a41581f548efec7f7ae37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 1e39419c089477a5be17606b9ffc90a390c823f2b81cf66fb6288cdbcce79c85
MD5 a83caf7e803726fbb8358fe11b05b7bc
BLAKE2b-256 1af1320e1041a27460d390fe2a2cf1ce74f7fa381f1af36a6fc66aa6efe16c17

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 131f6b0621fe0a57735ec5318f7e4aa705299c568aed48ff3bb1030ffd824cd3
MD5 e810ca5681b39637cdb6ef19490386ff
BLAKE2b-256 d8528a639d5b8650f0e88fdd296cd7e49064ea18800c3f6e99f4b02ed81591d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 08196821a2d903d389eb69ced3de4cc0352ed926074909bcff17d20256752d38
MD5 d5bf2d6f8d6d6baf650d3caa77a8843b
BLAKE2b-256 993a38ece5c5e171e82601b98a2a728592fd906e007068070395d734d3d45744

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b1c7ec8b1c7a1e983a18bfb6d3a1c812c6de94f7b742f9c70b94f79397f57c14
MD5 12ebad5bf1b8a2119a62d5375e9d5667
BLAKE2b-256 72ab8be64abc477a3dd1da9341d610c391dd5266c9fce61871ac3901494cf059

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ce515e599fe51e05e13df963339e75874529cb75c971b73319408acd5b2f7e5e
MD5 9ee1bd0de1d7d5c4b4e2d90ac3109e77
BLAKE2b-256 decf612186d220d71c01cf07b17ecdd068d9ea0d4808f4cad994ef321fcaa4e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1bd8aef44b2d1ba8a6beefcb41b9d6a797f72f8514acd0a9819fa2ed1b1ee277
MD5 073bc9f418cc178c9ec35d8800bb3634
BLAKE2b-256 99fc45e2986cfb39a000b153cdff5e9cb404e45a20949986610013b65ea1917f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5afac7af59480ba2ca748516e877a4f344e7d80bfa7304d9e99eed0d10ef2b7d
MD5 d18a10fc47a1209ae3eb7ccb79a4952f
BLAKE2b-256 57571f2835b965b1adb676bc64556dd7c6ec36b91d3b399e9ce523235f8d33b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f12e028d8de44f9aa6a3b34d44ca6757c9ef9f252aa477161559fe2a91d5a47c
MD5 5b42b140886724739f84508e9e430ab0
BLAKE2b-256 bfa4d9cf98b28370dd98ac36468e20a516987d34267d4127b286665147bf44c9

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f17a99f5686952452e1ac56729a33d8a2659b16b29eaae2a70ebc6f2b74a6842
MD5 b96f9afe1bad8bf8bffbf6d3c2c0e6a1
BLAKE2b-256 60a262a6c10cc3af052a64e5c4631fec9fc3b01f9f06c59d5ee3715d44ba9c2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5fe1a0f453cbcb074896fe926101417b29a1e60e19844c0f2987ffe1c2315c99
MD5 1b481632c7cdb19277b8008c96e4cbb5
BLAKE2b-256 955090cf468312733685e1e4e4c32b1cd9fd2fd4dd039260826655b4f8a463e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e821a003f47a43e4282996f16361c42f6d73d7663f99b80228909556048a4647
MD5 451549e3f085c9ad8733cb5392ee66e0
BLAKE2b-256 37840416ef5aefa28b3bd289e492c0f03019da733605f31d936466ff1ef4a373

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 33afa1e7cda02c7f108f7f7752fe4c2e5fd5376906b59a0524295aca26a17830
MD5 ce526cc6a1c8ebaf03da7df4a1ff944c
BLAKE2b-256 d79048f8b47b3f534cd4ed8ef0609245ffe0012e66e9c6de726fa78acb10a805

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0b9713744bc9269316b6d394939c134456f7d072c96207e1bdcb5a5373b4ecb
MD5 b452ad1f43527852bb4ff9a41cc82dd3
BLAKE2b-256 e73649bb1357a18efc91575dba246ecc0ea2e990f52f5f9225862bd5a9568079

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.11-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b419d34ba7ba1fa637744e9a452b898ca0a6bb981b9fe9fea3ff877736b9eb73
MD5 559718260b8d756b60798cf3bf2ff144
BLAKE2b-256 6f63e1bd638f182615499c1dd4f8cfad2a87530d6519d9e17cb08dcecdca5082

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d2dad7e248dd2b4d2b9532ecf7e20166797708cca10ac8dfa3872b797b0d4b07
MD5 7f7232bf03a594f3add4fd78f2413b4a
BLAKE2b-256 dce01320f6e93248da4a30b9f5c907d02c4fa4533b4f7c1073fc7cbac23788a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.11-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a7e02a16b2bcd2a9f12274fefd4e556609e56700b771421d1530653ef219abae
MD5 3fac92716c77e9ed5012acf7e64712e0
BLAKE2b-256 c2a2c89d1e9f84af98be3fc428ec606befbc94f83b459bc97b6a2a1b93c17a39

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