diff options
author | jaseg <git@jaseg.de> | 2021-06-13 15:00:17 +0200 |
---|---|---|
committer | jaseg <git@jaseg.de> | 2021-06-13 15:00:17 +0200 |
commit | 4eb0e063bcd34c21b737023aa6ed5baed80658d1 (patch) | |
tree | 3a56ef7d05f4f64cde930f2432119986e4aab49d /gerber/cam.py | |
parent | 889ea37d9b66cbfb7a61795c7750b9f4311faa3f (diff) | |
download | gerbonara-4eb0e063bcd34c21b737023aa6ed5baed80658d1.tar.gz gerbonara-4eb0e063bcd34c21b737023aa6ed5baed80658d1.tar.bz2 gerbonara-4eb0e063bcd34c21b737023aa6ed5baed80658d1.zip |
Repo re-org, make gerberex tests run
Diffstat (limited to 'gerber/cam.py')
-rw-r--r-- | gerber/cam.py | 286 |
1 files changed, 0 insertions, 286 deletions
diff --git a/gerber/cam.py b/gerber/cam.py deleted file mode 100644 index 4f20283..0000000 --- a/gerber/cam.py +++ /dev/null @@ -1,286 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- - -# copyright 2014 Hamilton Kibbe <ham@hamiltonkib.be> -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -CAM File -============ -**AM file classes** - -This module provides common base classes for Excellon/Gerber CNC files -""" - - -class FileSettings(object): - """ CAM File Settings - - Provides a common representation of gerber/excellon file settings - - Parameters - ---------- - notation: string - notation format. either 'absolute' or 'incremental' - - units : string - Measurement units. 'inch' or 'metric' - - zero_suppression: string - 'leading' to suppress leading zeros, 'trailing' to suppress trailing zeros. - This is the convention used in Gerber files. - - format : tuple (int, int) - Decimal format - - zeros : string - 'leading' to include leading zeros, 'trailing to include trailing zeros. - This is the convention used in Excellon files - - Notes - ----- - Either `zeros` or `zero_suppression` should be specified, there is no need to - specify both. `zero_suppression` will take on the opposite value of `zeros` - and vice versa - """ - - def __init__(self, notation='absolute', units='inch', - zero_suppression=None, format=(2, 5), zeros=None, - angle_units='degrees'): - if notation not in ['absolute', 'incremental']: - raise ValueError('Notation must be either absolute or incremental') - self.notation = notation - - if units not in ['inch', 'metric']: - raise ValueError('Units must be either inch or metric') - self.units = units - - if zero_suppression is None and zeros is None: - self.zero_suppression = 'trailing' - - elif zero_suppression == zeros: - raise ValueError('Zeros and Zero Suppression must be different. \ - Best practice is to specify only one.') - - elif zero_suppression is not None: - if zero_suppression not in ['leading', 'trailing']: - # This is a common problem in Eagle files, so just suppress it - self.zero_suppression = 'leading' - else: - self.zero_suppression = zero_suppression - - elif zeros is not None: - if zeros not in ['leading', 'trailing']: - raise ValueError('Zeros must be either leading or trailling') - self.zeros = zeros - - if len(format) != 2: - raise ValueError('Format must be a tuple(n=2) of integers') - self.format = format - - if angle_units not in ('degrees', 'radians'): - raise ValueError('Angle units may be degrees or radians') - self.angle_units = angle_units - - @property - def zero_suppression(self): - return self._zero_suppression - - @zero_suppression.setter - def zero_suppression(self, value): - self._zero_suppression = value - self._zeros = 'leading' if value == 'trailing' else 'trailing' - - @property - def zeros(self): - return self._zeros - - @zeros.setter - def zeros(self, value): - - self._zeros = value - self._zero_suppression = 'leading' if value == 'trailing' else 'trailing' - - def __getitem__(self, key): - if key == 'notation': - return self.notation - elif key == 'units': - return self.units - elif key == 'zero_suppression': - return self.zero_suppression - elif key == 'zeros': - return self.zeros - elif key == 'format': - return self.format - elif key == 'angle_units': - return self.angle_units - else: - raise KeyError() - - def __setitem__(self, key, value): - if key == 'notation': - if value not in ['absolute', 'incremental']: - raise ValueError('Notation must be either \ - absolute or incremental') - self.notation = value - elif key == 'units': - if value not in ['inch', 'metric']: - raise ValueError('Units must be either inch or metric') - self.units = value - - elif key == 'zero_suppression': - if value not in ['leading', 'trailing']: - raise ValueError('Zero suppression must be either leading or \ - trailling') - self.zero_suppression = value - - elif key == 'zeros': - if value not in ['leading', 'trailing']: - raise ValueError('Zeros must be either leading or trailling') - self.zeros = value - - elif key == 'format': - if len(value) != 2: - raise ValueError('Format must be a tuple(n=2) of integers') - self.format = value - - elif key == 'angle_units': - if value not in ('degrees', 'radians'): - raise ValueError('Angle units may be degrees or radians') - self.angle_units = value - - else: - raise KeyError('%s is not a valid key' % key) - - def __eq__(self, other): - return (self.notation == other.notation and - self.units == other.units and - self.zero_suppression == other.zero_suppression and - self.format == other.format and - self.angle_units == other.angle_units) - - def __str__(self): - return ('<Settings: %s %s %s %s %s>' % - (self.units, self.notation, self.zero_suppression, self.format, self.angle_units)) - - -class CamFile(object): - """ Base class for Gerber/Excellon files. - - Provides a common set of settings parameters. - - Parameters - ---------- - settings : FileSettings - The current file configuration. - - primitives : iterable - List of primitives in the file. - - filename : string - Name of the file that this CamFile represents. - - layer_name : string - Name of the PCB layer that the file represents - - Attributes - ---------- - settings : FileSettings - File settings as a FileSettings object - - notation : string - File notation setting. May be either 'absolute' or 'incremental' - - units : string - File units setting. May be 'inch' or 'metric' - - zero_suppression : string - File zero-suppression setting. May be either 'leading' or 'trailling' - - format : tuple (<int>, <int>) - File decimal representation format as a tuple of (integer digits, - decimal digits) - """ - - def __init__(self, statements=None, settings=None, primitives=None, - filename=None, layer_name=None): - if settings is not None: - self.notation = settings['notation'] - self.units = settings['units'] - self.zero_suppression = settings['zero_suppression'] - self.zeros = settings['zeros'] - self.format = settings['format'] - else: - self.notation = 'absolute' - self.units = 'inch' - self.zero_suppression = 'trailing' - self.zeros = 'leading' - self.format = (2, 5) - self.statements = statements if statements is not None else [] - if primitives is not None: - self.primitives = primitives - self.filename = filename - self.layer_name = layer_name - - @property - def settings(self): - """ File settings - - Returns - ------- - settings : FileSettings (dict-like) - A FileSettings object with the specified configuration. - """ - return FileSettings(self.notation, self.units, self.zero_suppression, - self.format) - - @property - def bounds(self): - """ File boundaries - """ - pass - - @property - def bounding_box(self): - pass - - def to_inch(self): - pass - - def to_metric(self): - pass - - def render(self, ctx=None, invert=False, filename=None): - """ Generate image of layer. - - Parameters - ---------- - ctx : :class:`GerberContext` - GerberContext subclass used for rendering the image - - filename : string <optional> - If provided, save the rendered image to `filename` - """ - if ctx is None: - from .render import GerberCairoContext - ctx = GerberCairoContext() - ctx.set_bounds(self.bounding_box) - ctx.paint_background() - ctx.invert = invert - ctx.new_render_layer() - for p in self.primitives: - ctx.render(p) - ctx.flatten() - - if filename is not None: - ctx.dump(filename) |