update structure and readme and add area

This commit is contained in:
2024-07-20 15:29:58 +02:00
parent 91beedbc31
commit 3a5045a49b
8 changed files with 301 additions and 21 deletions

View File

@@ -1,8 +1,29 @@
Install, in "development mode", so any change in the local repo is effective: # Features
commands
- `eng-area`: area of a simple polygon
- `eng-awg`: diameter/area from AWG wire size
- `eng-beam`: calculate mechanical beam eigen-frequencies
- `eng-plate`: central deflection and min. thickness of a circular plate
- `eng-tube`: bubkling stress of a tube
libs
- `engineering.area.area(vertices)`
- `engineering.awg.diameter(number)`
- `engineering.awg.area(number)`
- `engineering.beam.eigen_frequency_fixed_free(n, E, I, rho, A, L)`
- `engineering.plate.deflection_pinned(p, r, nu, E, t)`
- `engineering.plate.deflection_clamped(p, r, nu, E, t)`
- `engineering.plate.thickness_min(p, d, Rp02, S)`
- `engineering.plate.allowable_stress(sigma, S)`
# Install
In "development mode", so any change in the local repo is effective:
python -m pip install --editable git+<url>#egg=engineering --src=$HOME/repos --prefix=$HOME/.local --break-system-packages python -m pip install --editable git+<url>#egg=engineering --src=$HOME/repos --prefix=$HOME/.local --break-system-packages
Uninstall: # Uninstall
python -m pip uninstall engineering --break-system-packages python -m pip uninstall engineering --break-system-packages

View File

@@ -2,35 +2,29 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from os import path from os import path
from setuptools import setup, find_packages from setuptools import setup, find_packages
from pkg_resources import parse_version
with open(path.join(path.abspath(path.dirname(__file__)), 'README.md'), encoding='utf-8') as f: with open(path.join(path.abspath(path.dirname(__file__)), 'README.md'), encoding='utf-8') as f:
long_description = f.read() long_description = f.read()
setup( setup(
name="engineering", name="engineering",
version="2024.07.20", version=str(parse_version("2024.07.20")),
description="engineering tools", description="engineering tools",
long_description=long_description, long_description=long_description,
author="Daniel Weschke", author="Daniel Weschke",
author_email="daniel.weschke@directbox.de", author_email="daniel.weschke@directbox.de",
package_dir={'': 'src'}, package_dir={'': 'src'},
packages=find_packages("src"), packages=find_packages(where="src"),
py_scripts = [
# mech
'beam.py',
'plate.py',
'tube.py',
# et
'awg.py',
],
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [
# mech # mech
'eng-beam=beam:main', 'eng-area = engineering.area:main',
'eng-plate=plate:main', 'eng-beam = engineering.beam:main',
'eng-tube=tube:main', 'eng-plate = engineering.plate:main',
'eng-tube = engineering.tube:main',
# et # et
'eng-awg=awg:main', 'eng-awg = engineering.awg:main',
], ],
}, },
keywords = 'mechanical electrical engineering mechanics plate tube stress', keywords = 'mechanical electrical engineering mechanics plate tube stress',

125
src/engineering/area.py Executable file
View File

@@ -0,0 +1,125 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""\
Determine the area of a simple polygon
"""
from builtins import input
import sys
import re
__author__ = "Daniel Weschke"
__copyright__ = "Copyright 2019 Daniel Weschke"
__credits__ = ["Daniel Weschke"]
__license__ = "MIT"
__version__ = "2019.01.16"
__maintainer__ = "Daniel Weschke"
__email__ = "daniel.weschke@directbox.de"
__status__ = "Production" # "Prototype", "Development", "Production"
VERSION = """\
%(prog)s version {version} {copyright}""".format(
version=__version__, copyright=__copyright__)
EPILOG = """\
"""
def area(vertices):
r"""
shoelace formula, shoelace algorithm, Gauss's area formula, surveyor's formula
http://stackoverflow.com/questions/24467972/calculate-area-of-polygon-given-x-y-coordinates
"""
count = len(vertices) # of corners
result = 0.0
for i in range(count):
j = (i + 1) % count
result += vertices[i][0] * vertices[j][1] - vertices[j][0] * vertices[i][1]
result = abs(result) / 2.0
return result
def main():
"""\
Main function
"""
import argparse
from .helper.color import primary as command, info, error, reset, csi, Style, FGColor
parser = argparse.ArgumentParser(
description=__doc__, prefix_chars='-', epilog=EPILOG,
#usage="%(prog)s [OPTION]... NAME",
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument('POINTS', nargs='?',
help='List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]"')
parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
parser.add_argument('-V', '--version', action='version', version=VERSION)
parser.add_argument('-D', '--debug', dest='debug', action='store_true', help=argparse.SUPPRESS)
args = parser.parse_args()
# initialise variables
choice = args.POINTS if args.POINTS else '1'
points = []
a = 0.
if args.debug:
print("args", args)
print("choice", choice)
if args.POINTS is None:
print("You may type '" + command('help') +
"' for information on how to use this program")
else:
rechoice = re.match(r'\[.*\]', ''.join(choice))
if rechoice and rechoice.group():
points = eval(rechoice.group())
if args.debug:
print('list given: %s' % points)
a = area(points)
print('area: %s' % a)
choice = 'q'
try:
while choice not in ('q', 'quit', 'exit'):
choice = input(" %i Points, area: " % len(points) +
info("%.2f ") % a + "> " + csi(Style.NOBOLD, FGColor.COMMAND))
sys.stdout.write(reset())
choice = " ".join(choice.split()) # replace multiple spaces with single one
if choice[:1] == 'a':
choicesplit = choice.split(' ')
if len(choicesplit) == 3:
points.append([float(choicesplit[1]), float(choicesplit[2])])
a = area(points)
else:
print(' ' + error('insert exact two coordinates, like:') +
' ' + command('a <x-coordinate> <y-coordinate>'))
elif choice == 'list':
if args.debug:
print("points", points)
for index, point in enumerate(points):
print('%2i' % (index+1), point)
elif choice == 'help':
print('\n'
'Determine the area of a simple polygon\n'
'\n'
'Commands:\n'
' ' + command('a <x-coordinate> <y-coordinate>') + ' ' +
'enter new absolute data point\n'
' ' + command('r <x-coordinate> <y-coordinate>') + ' ' +
'enter new relative data point\n'
' ' + command('list') + ' ' +
'list all points entered\n'
' ' + command('q')+', '+command('quit')+', '+command('exit') + ' '+
'exit the program\n'
'')
except KeyboardInterrupt:
sys.stdout.write(reset())
print("Shutdown requested...exiting")
return 2
except Exception:
sys.stdout.write(reset())
import traceback
traceback.print_exc(file=sys.stdout)
return 2
return 0
if __name__ == "__main__":
sys.exit(main())

View File

@@ -3,7 +3,6 @@
"""\ """\
Python script to determine the diameter for a given AWG wire size. Python script to determine the diameter for a given AWG wire size.
""" """
from __future__ import absolute_import, division, print_function, unicode_literals
import sys import sys
from math import pi from math import pi
@@ -14,7 +13,7 @@ __license__ = "MIT"
__version__ = "2019.01.16" __version__ = "2019.01.16"
__maintainer__ = "Daniel Weschke" __maintainer__ = "Daniel Weschke"
__email__ = "daniel.weschke@directbox.de" __email__ = "daniel.weschke@directbox.de"
__status__ = "Production" # "Prototype", "Development", "Production" __status__ = "Development"
VERSION = """\ VERSION = """\
%(prog)s version {version} {copyright}""".format( %(prog)s version {version} {copyright}""".format(

View File

@@ -3,7 +3,6 @@
"""\ """\
Beam Beam
""" """
from __future__ import absolute_import, division, print_function, unicode_literals
from math import sqrt, pi from math import sqrt, pi
__author__ = "Daniel Weschke" __author__ = "Daniel Weschke"

View File

@@ -0,0 +1,144 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 21 19:39:44 2015
@author: Daniel
"""
import sys
systeminfo = ''
colorfont = False
try:
import colorama
colorama.init()
colorfont = True
except:
try:
import tendo.ansiterm
colorfont = True
except:
def in_ipy():
"""
Check if in IPython
"""
try:
get_ipython().config
return True
except NameError:
return False
def in_ipynb():
"""
Check if in IPython Notebook
http://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook
"""
try:
cfg = get_ipython().config
return true if cfg['IPKernelApp']['parent_appname'] == 'ipython-notebook' else False
except NameError:
return False
if hasattr(sys.stderr, "isatty") and sys.stderr.isatty():
"""
http://stackoverflow.com/questions/7445658/how-to-detect-if-the-console-does-support-ansi-escape-codes-in-python
"""
try:
import platform
systeminfo = platform.system()
if platform.system()=='Windows':
colorfont = True
else:
colorfont = True
except:
colorfont = False
elif in_ipy():
colorfont = True
else:
pass
class Style:
"""\
Styling
"""
END = '0' # reset all (colors and brightness)
BRIGHT = '1' # bright (this might be the standard on some terminals)
DIM = '2' # dim (looks same as normal brightness on some terminals)
ITALIC = '3' # (not supported on some terminals)
UNDERLINE = '4'
NOBOLD = '22' # normal brightness
class FGColor:
"""\
Foreground colors
"""
BLACK = '30'
RED = '31'
GREEN = '32'
YELLOW = '33'
BLUE = '34'
MAGENTA = '35'
CYAN = '36'
WHITE = '37'
RESET = '39' # (not supported on some terminals)
COMMAND = GREEN
INFO = YELLOW
ERROR = RED
class BGColor:
"""\
Background colors
"""
BLACK = '40'
RED = '41'
GREEN = '42'
YELLOW = '43'
BLUE = '44'
MAGENTA = '45'
CYAN = '46'
WHITE = '47'
RESET = '49' # (not supported on some terminals)
def csi(*v):
"""
ANSI escape codes
CSI for Control Sequence Introducer (or Control Sequence Initiator)
style, color, background color
http://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python
https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
"""
return '\x1B['+';'.join(map(str, v))+'m'
def color(string, *styleColorBgcolor):
"""\
Color string if posible
"""
if colorfont:
return csi(*styleColorBgcolor) + string + csi(Style.END)
else:
return string
def primary(string):
"""\
Styling for command string
"""
return color(string, Style.NOBOLD, FGColor.COMMAND)
def info(string):
"""\
Styling for info string
"""
return color(string, FGColor.INFO)
def error(string):
"""\
Styling for error string
"""
return color(string, FGColor.ERROR)
def reset():
"""\
Reset styling
"""
return csi(Style.END)

View File

@@ -3,7 +3,6 @@
"""\ """\
Circular plate Circular plate
""" """
from __future__ import absolute_import, division, print_function, unicode_literals
from math import sqrt from math import sqrt
__author__ = "Daniel Weschke" __author__ = "Daniel Weschke"

View File

@@ -3,7 +3,6 @@
"""\ """\
Tube Tube
""" """
from __future__ import absolute_import, division, print_function, unicode_literals
from math import sqrt from math import sqrt
__author__ = "Daniel Weschke" __author__ = "Daniel Weschke"