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.4-cp311-cp311-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.4-cp311-cp311-macosx_11_0_arm64.whl (356.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.9+ x86-64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.4-cp310-cp310-macosx_11_0_arm64.whl (359.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.9+ x86-64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.4-cp39-cp39-macosx_11_0_arm64.whl (356.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Uploaded CPython 3.9macOS 10.9+ x86-64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.4-cp38-cp38-macosx_11_0_arm64.whl (363.2 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

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

Uploaded CPython 3.8macOS 10.9+ x86-64

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

Uploaded CPython 3.7mWindows x86-64

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

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.7mmacOS 10.9+ x86-64

python_fcl-0.7.0.4-cp36-cp36m-win_amd64.whl (853.0 kB view details)

Uploaded CPython 3.6mWindows x86-64

python_fcl-0.7.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ x86-64

python_fcl-0.7.0.4-cp36-cp36m-macosx_10_9_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 69474e929d6dd91b2a62c98e059dfa88d9288d13cd69cc17e00eeab8059d796b
MD5 23ac453f065bd18d8d930ac17f44c1b9
BLAKE2b-256 0b7e4783d5e0e71fe3cad97b719644fcb7c434335c0566a199eac6a9bfdb05e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8aceec08beba22283b1f5465838f044a197ad3d9f8cfd20d9f8a3090c128804
MD5 6d4b916a206ef8ed2f73bb83c5130f11
BLAKE2b-256 c1488118bef53baf112d7a1b7e3337713b8065660ebcd52b220c6a8d6eb62a6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5d323f33d4fb9325b873899c88f2b0ee1dab394fa910544b42f9a9ffdc9fb633
MD5 b4a84307e867d629b74cd589eb72ea62
BLAKE2b-256 d566d2a766befb8e11d337079120db7c681d82b4d31de45b0f23a4aea17dfea3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5f9de9c0d85126e482fb97d412fe6e92346039b07fa63a712500763e1554d102
MD5 0e6bc18d0124b236d49159807ce36f38
BLAKE2b-256 3540404d4d85da1b93314f6bcc680d20833ccb50859255b2a9a384d51ce627f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 39949c8b0e0fdd92fb1cdadbb3a1f49eb98eedfb6d010fab635723fd285be80e
MD5 fb905feeb3c5c30222288401cbfb2d66
BLAKE2b-256 699ed8acc1d5c8e8fe435b087c1b9245e0d89f6b6b60239959530aea8802cdf2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f2a56ddfa5f66003650171c20470c27fb797be0a29eb53c485004a1c906b19af
MD5 3dc1c54bd68163b50f3172173a73293c
BLAKE2b-256 b43185180ac5c5ab4af8a9aa163518adf6d79025c4e38b7eef41464b87573c3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fafe9e9c15e2ba08c9d4ae13cd50b70c8081e0e44cf9b9acb108e87c7a526084
MD5 dd11666429223e8b2505ae7db82c4431
BLAKE2b-256 72314c67107fbad440619130707f3e0392bed952303979e59a96e84cec227930

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 45f2776fedbdc69bb666f719a49b37bfbb0ffeae103255589faff609ebb6f0af
MD5 64a3bb2b79706944d05452fcfb8c619d
BLAKE2b-256 2067b31c5776b1085db8cac60a04fce7116e2bb19a710e013cd833cb1f755de3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: python_fcl-0.7.0.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.1

File hashes

Hashes for python_fcl-0.7.0.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b937a16dd532da6804338fcdba2fcf4f8964d87e506696baf964d918e023979b
MD5 4d1149b075b12693f7710fac90911284
BLAKE2b-256 fd9318371ef7a44090a7f7466e6f4039021f43fdde28da195244549570202058

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c0576695566fb4fe0bcfb134d74e592e3f4a7876ee00473a77435b34556edf50
MD5 02d462f06e729a524abcd9fc255617c6
BLAKE2b-256 576219a181b3a6fa1ddbbd5d116a0a8c00de1b77056e008667a775e34c1f6875

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77ae1f882c95d9b178e209c87b920b99979426f7741a8d4ea87a4c931868e0e8
MD5 705a462d4574eda5eb1424f5d6c1f11e
BLAKE2b-256 996658a490d2078c825f1c867318b9ff488ec7c9c4ee6b3c5307d50fb4b045c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e04318c65f0e14c8f92f8ce7c17d01da75644596f21e64710f7f21e099ab714a
MD5 601d3c10e0c9a9f2663c0f66e7d273e9
BLAKE2b-256 e55bb81b4c94f026c07c9efe988bee8c15e0556407760c9af66269f141f58888

See more details on using hashes here.

File details

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

File metadata

  • Download URL: python_fcl-0.7.0.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.1

File hashes

Hashes for python_fcl-0.7.0.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6436fe2bac22f25536e148a91169a50e9cbf7c77476d2017184eaf44cbb2ace4
MD5 c996c1590895de463696caa316c5cc6a
BLAKE2b-256 7b79504a587fe0f8a160553ce0fb77bbe7b19c6ed6258978379e7e063ceddd37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bb659bf12204797e4a92775152446cc5b667ae46526d0f6f82541e24fa036236
MD5 65e1e8e85d74dd55c34c332c56e46519
BLAKE2b-256 cce3b0b875ea8a767b8aad430d0cd1294d36bf1875dd5554e11bc058a557cf50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88f7ea486dcb3f2f06211b511cb32b9bc017bc2abe1a34958a6f1be578aac845
MD5 1e79b97a74ee64264870cd2d37d9aa4e
BLAKE2b-256 fa82c55c08030057cd5267b33d369e83a44f1b5954a6d6665f1bf28c402ff143

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5a8334824414c24137be6d135d4036d82a989251725e2820a8cc1bacf3be9fe2
MD5 e5b358965912a44461deb77c7396e2c7
BLAKE2b-256 d11d4329707ef63722ea0cfdf03eaeb8d70477c3e79e5d9bebc79a526d20ce66

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 765659ddac27a3a74390126e910d64f8a1cbc816824624049deb3274ab48de6e
MD5 8008fa6e2fefaa90be524b954e40fc74
BLAKE2b-256 e00ab30013d873d7f4751a27b5dfa70efbb8b09c13ae7b8160a7c05fd0926f3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ba6b0d1b2a79f550774767e45f42aa21f933e582a08dd2175b660a014b21919b
MD5 828b5bb02307d2f49039d22c5fdbfb16
BLAKE2b-256 d379d31556750b1ce0b529aa5aca2b15efe48c41f9153431df486a93251561db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 34f4846b3ba2e42cbb105bac21a91b692dfd30361bfc21da094c93bfd83b6401
MD5 af29e307b014ebd6ceb1f3d9bc4116e3
BLAKE2b-256 357f7bdd695f72657a4d9a2a6c51861b5a3b5546a2d9fb83f3f1b6941de4e513

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.4-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 d49405639ab5966248751db63a3802420dc601e050b86839454bc2db46e8e6d4
MD5 6d06607acefdf7935b774508054145a3
BLAKE2b-256 ce59a56d9f332e0efda73856bba517e06882526de39b03b260bb7353b178fccc

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d46dcc41fa57ff10694f8f6454cb2eb71eb0c2e6b086168533242a18fe1cdf17
MD5 d072508f4ce2d8879d3f7b78a009dc58
BLAKE2b-256 95badacb2c37463b9f4ebd6f4f3d44fb2551411b8f641643df182fc5962e13d2

See more details on using hashes here.

File details

Details for the file python_fcl-0.7.0.4-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for python_fcl-0.7.0.4-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a250af4fb9846f4cc588cb741ba92862d6d36b6f5c2336409c1ed8c20a551b2d
MD5 2683142a153cf79b3fa3748ed67d1d38
BLAKE2b-256 2b6faeb51da0661bf1856bd1bdd6f0e84a14e499964d946430338ced34ef917d

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