Skip to main content

jointfinder

This package finds edge-to-edge and edge-to-surface joints of planar polygons.

Quickstart

This package accepts list of dictionaries as input. Each dictionary should have these elements:

  • name part name, numerical
  • points sequential points that make up a polygon in 3D cartesian coordinates, all points must be on a same plane (minimum 3 unique points per polygon)
  • plane (optional) plane unit vector (left hand thumb direction, sequential points being the fingers)
  • depth (optional, default: 0) polygon's thickness All scalars must be integer or float

Create test polygons (two squares).

polygons = []

# polygon name is #42
polygons += [{'name': 42, 
              'points': [[0, 0, 0], [0, 20, 0], [20, 20, 0], [20, 0, 0]], 
              'depth': 1}]

# polygon name is #43
polygons += [{'name': 43, 
              'points': [[20, 0, 0], [20, 20, 0], [40, 20, 0], [40, 0, 0]], 
              'depth': 1}]

Create JointFinder object. polygons input is tabulated as pandas dataframe. Accessible as object property df. Refer to pandas for more information on pandas.

from jointfinder import jf

JF = jf.JointFinder(polygons)
JF.df

two squares df

Each row represents a particular polygon's line member (edge of the polygon [x0, y0, z0] to [x1, y1, z1]). Each member has same plane vector ([nx, ny, nz]) and depth, in addition to polygon name. Plane vector is akin to left hand thumb direction, with left hand other fingers being the line sequence. This package does not validate the sequence. The depth (or plane's thickness) extrudes the same direction as plane vector.

Use plotting tool from util to view input polygons. This plotting tool does not plot polygon's depth.

from jointfinder import util

util.plot(JF.df)

two squares plot

Use find_joint() object function to run for solution.

joints = JF.find_joint()
joints

two squares output

Output is pandas dataframe. Prefixes A and B in columns indicate association to which polygon (a polygon that makes joint with other polygon). Each dataframe row indicates where a joint exists ([x0, y0, z0] to [x1, y1, z1]), by Polygon A's edge with either polygon B's edge or surface. Column type indicates if it is a butt joint (1: edge to edge) or t-joint (0: edge to surface).

Dataframe as Input

Alternatively, users can create their dataframe themselves (or parse to from other sources) to input directly to JointFinder as it also accepts pandas dataframe as input (in addition to list of dictionaries). Do take note that the format must follow convention of object property df.

To simulate, use util.create_dummy_block() for test dataframe.

df = util.create_dummy_block()
util.plot(df)

one block plot

Similarly, create JointFinder object with test dataframe then run find_joint() object function.

JF = jf.JointFinder(df)
joints = JF.find_joint()
joints

one block output

Default test dataframe has three squares that make up a block with t-joints. To create more, pass number of rows and columns as x and y arguments to tile them.

E.g. util.create_dummy_block(x=2, y=1) creates blocks tiled in 2 x 1.

2x1 block plot

Below is example of 50 x 50 blocks.

df = util.create_dummy_block(x=50, y=50)
JF = jf.JointFinder(df)
joints = JF.find_joint()
joints

50x50 block output

Handling Large Dataframe

It is advised to run the module's jf directly from shell or console to better benefit from computing concurrency while handling large dataframe. Prior to running, the dataframe location must be first pickled (made persistent). Alternatively, it may also be accessed from memory location which user must find out manually. Input system argument dpath to indicate where the pickled dataframe is or from memory. Output will be saved in path stated in tpath.

Use util's save_df() function to create pickle, pass dataframe and (path if otherwise desired and) file name as arguments.

util.save_df(df, 'test.pkl')

Run module's jf from shell or console (use ! only if running from jupyter. See jupyter from more information on jupyter).

!python -m jointfinder.jf dpath=test.pkl tpath=test_result.pkl

50x50 block output shell

As output is also pickled, use util.load_df() to load dataframe back to a variable. User may also export the result to other formats such as csv.

result = util.load_df('test_result.pkl')
result.to_csv('test_result.csv')

About

Beta version, v1.1.x, has limited features. Full release is from v1.2.0 onwards. This package uses other dependencies (pandas, numpy, numba, tqdm, matplotlib).

Email: zhiyung.tay@singaporetech.edu.sg; januwar.hadi@singaporetech.edu.sg

Singapore Institute of Technology.

Metadata

Release files for jointfinder 1.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for jointfinder 1.1.8
File Interpreter ABI Platform
jointfinder-1.1.8-py3-none-any.whl Python 3 none any Details

Release files / jointfinder-1.1.8-py3-none-any.whl

Download URL jointfinder-1.1.8-py3-none-any.whl
Size 29.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3ff0615eb8c7d183b2460c98a100501fa03a2254ecc6f894a29bb1bb04cd8aad
BLAKE2b-256 checksum
How to use checksums
bfef3b3e2a43ca6bbbef12b0a0daec4dc08d257200ac410e3f533f5ecbc8779c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/51.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

Release history Release notifications | RSS feed

This release

1.1.8 This release

1 release file

1.1.7

1 release file

1.1.6

1 release file

1.1.5

1 release file

1.1.4

1 release file

1.1.3

2 release files

1.1.2

2 release files

1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page