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

python_fcl-0.7.0.6-cp312-cp312-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.12 Windows x86-64

python_fcl-0.7.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp312-cp312-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

python_fcl-0.7.0.6-cp312-cp312-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

python_fcl-0.7.0.6-cp311-cp311-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.11 Windows x86-64

python_fcl-0.7.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp311-cp311-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

python_fcl-0.7.0.6-cp311-cp311-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

python_fcl-0.7.0.6-cp310-cp310-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.10 Windows x86-64

python_fcl-0.7.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp310-cp310-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

python_fcl-0.7.0.6-cp310-cp310-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

python_fcl-0.7.0.6-cp39-cp39-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.9 Windows x86-64

python_fcl-0.7.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp39-cp39-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

python_fcl-0.7.0.6-cp39-cp39-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

python_fcl-0.7.0.6-cp38-cp38-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.8 Windows x86-64

python_fcl-0.7.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp38-cp38-macosx_11_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

python_fcl-0.7.0.6-cp38-cp38-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

python_fcl-0.7.0.6-cp37-cp37m-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.7m Windows x86-64

python_fcl-0.7.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.6-cp37-cp37m-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f48b2e19f41ee3506593a0e801896f3b5dd6d555d12f6c3fdd6cfaefc0edfc74
MD5 21d813de5e01075d65b42835f2abda7f
BLAKE2b-256 b41b601a5da20f58bddfcc87ed7a575c682959b20e045bc0b7c0b3124226b447

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf5c46915eec67343c4072ab13d5704edd58f19b4cb0040a1f9014a1f1a27af2
MD5 e824c2643f382d9f0344bc206a6524a2
BLAKE2b-256 c000cdb2afde2d7700d26b2df90bc40d72d18585e4f9a5d63d49b210a8d6bad0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3783f1f806006d78641e9b8cd5c2ba09af0f5e750b263582fe5f0103d7822251
MD5 0b3b93a7c83fdd2503b971c78bb920d6
BLAKE2b-256 08be4781f7da7dde661d32925c0a129d268e03e6bbe00aaa86e48af59c70da61

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 38365565342506d4def9cf05b8d308712a840db923aaf6afd6f18f4d310756b8
MD5 44af0d8667eee58c0dd7a74a7baadbbd
BLAKE2b-256 d53af63c4b7b11ca62d1ac2e24ec889b453e6a427ece53d56a8f8f6042a13b74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 849ccaa5dcdc3ee47f899e05234968cc664e608ad0dfb3c57a0e6f8d2c4ba5b0
MD5 208fb63c5e41f3d99af793a22bc39634
BLAKE2b-256 9d25e07849027a3688e3b1de3267ad13276e960c10ca82d8e7d29bdb9418cee6

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d2bbd86356ee79b9350b717c2f137bd9726b9fb6d82db4e70b17e99520f77e81
MD5 6aee05a7a8f312a41d3fe7e6f5074b5b
BLAKE2b-256 7f4f14f459dfafd8b6f150f569e1f04a189233a84269dddab9ff3cdcab166d5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fb51ade2f2e755f430a7e67d7226d2f79b319b2c56bf31b46278488f773eac63
MD5 c71a1cc6dac5a4e85bef6cc2232e392e
BLAKE2b-256 7409ef0c4379e4f51a326e1378303ee383b40f91aa6def01fbdf38edc3578dfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 030a599429c5674957ed3bf676fc1fcff0c002bd086cd39cb7c0f6827fc000bb
MD5 da14939af5b618381159f8bd5e1b0e29
BLAKE2b-256 7dd7a495005b883b65c95e57f30c94f2cb2ce981acfcfd7ec6f083dbf98799b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c3f623fac8efceba63652f44e58dfd895beb02afb77b7a57550c69704d5656cf
MD5 c3447b4fcc0ab98ae2736d27257e0076
BLAKE2b-256 1270043c406191c1d640e626be26fb2b133a0969c777c48cd2b1ac8e7a728df4

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 66f2114ddebaf9dd0b218c0864788bb96bfd74d506c3c9bd15daa60d22501e64
MD5 f2ecc35d2ade327d75e0c68a7dc8d8b0
BLAKE2b-256 79c78a68f96cdf740bf00c3fd45b7eead79e24cc53bc6ab9602c33d2e2bbf232

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 81e887768209f607f68428891f2c25f8a52b8ed6e434d781d153e114b790387a
MD5 809c9c7c912134e39396f0da385cdcf5
BLAKE2b-256 2475bca6398cdfab31505c9916b630e4b902f4379240af1172de4db17036030a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c3a396cdb02f6f9068b1b2dcabea69ba14f5eb3d7fcbb03883e48675d5a93fbf
MD5 cc212a6ab64b8f8ac7da029b1b6b38a5
BLAKE2b-256 b034ce51c5813719556d4d41018ebecc1e8e933f66993021c826e56d5dcaaab6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d549ef281de6aaf241955a881bae0315a6ad23c6c5253b3245c7d29d300c93a5
MD5 8591faf3eeced382c1df1076a54dc334
BLAKE2b-256 3ff9cb9fdfc7b86a5178d92cd1ccb943a22b80d1fa309efcdd302c4dae45a14c

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 debdb7329efabbf27344ad97d07de70463838a17d53683123802a7d6e3b77acc
MD5 55a92dfbda71214091298bd8847fd691
BLAKE2b-256 3f0fff958f9a31220b6563a268387641d232c9943cc32a4f117a3668822afdc8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aabd3bf5fbca2c1deb3cf6a91beb9a5f93c9af67c92732edbfdd7c458ff72c57
MD5 ac53bc9c04017327bf9452c74154bc64
BLAKE2b-256 cff8b2f62704aa054e2ef558fb492b7175f935e8107590e65b731a17ef4903b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1219807bc89d465592dbc243e89a07c638ebb9d960674ce9421120449e2557cd
MD5 5ae6c7ffd0caf60e186b69740b2e75cd
BLAKE2b-256 edeb16d1e031fd801525aa8c8ed284e3742906ab265207d8f571360bd3ab8c20

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3431d74e388a5316430957339bf0f8fc0a3883eca2e3fc537423f366a82b74f4
MD5 e8c1062f7fae7dfafd3c1ad4b759f793
BLAKE2b-256 3ccaca0b8bb1f32ddbf968ec1690e77c287d4b3355251328ecd27ac676537d8d

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f8d025aa472e8b4e5d93010dbd19166303119d7fae2ddf6ae56a62e9bf5315eb
MD5 7aabe4d066ff1dcecae1240c97e2c42b
BLAKE2b-256 2049e9ecd90c24790271b42227b97ff714c9aa58848269fb1a674941efe63e04

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7af23d76d9bd53f676c019083154091d46abeb2d0983f7aea7462731f6cc3c2
MD5 db4b37d00a1215894485876301e8eb15
BLAKE2b-256 9798a8f0b200c2f034f51a8a97adb680b7cbd9a87da44e31ba1733f85234d35b

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3eb1ce5b49687e18e166308eec501ae77801380e456ae27e0b884cb37c92b8eb
MD5 dc095de2da98f45083c74dea8a08269f
BLAKE2b-256 a60c0a107333ea87484d3e554e15b21c82fc125f23f1243d11bfd00c1a431a1a

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f1a80643693696bbf3e227355b1fb8be4990bb0f74202cb87b31dfe4627f9222
MD5 5a00df22748f0bace7030ef50967dbed
BLAKE2b-256 3d92db99b18b543f78fec3454a92425f1b1d7cc5d3b44d9964035fda5a0b8127

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7f339db66b8658c75aad183b26ea71eacdcddca8968c780b7d5fc63d18803e0
MD5 4ccc2d947b8c99b785c3e7ce90ae2d5e
BLAKE2b-256 572b0618d2164500cc078f1109ad794f4a0ec78290bbc016bfdf18bf32931029

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.6-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.6-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c3c3b3ee8c0fb5b00381db7fc90df1bf8cced9624bb90387e623dc6eede493bd
MD5 bb94395ccdc59a0567272174d7970669
BLAKE2b-256 4ac3480f937494909673d157ec5b6542cf32566f42bdeed1dd41f27e3024e827

See more details on using hashes here.

Supported by

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