[3D] Added options to control the resistors tolerance

- `field_tolerance` field/s to look for resistor tolerance.
- `default_resistor_tolerance` which tolerance to use when none found.
This commit is contained in:
Salvador E. Tropea 2023-03-21 09:57:22 -03:00
parent c94b03042c
commit f3645d3264
8 changed files with 48 additions and 23 deletions

View File

@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.6.2] - UNRELEASED
### Added
- Global options:
- `colored_tht_resistors` to disable the 3D colored resistors.
- `field_tolerance` field/s to look for resistor tolerance.
- `default_resistor_tolerance` which tolerance to use when none found.
- 3D: colored 3D models for THT resistors
### Fixed

View File

@ -219,10 +219,18 @@ This file comes from KiKit, but it has too much in common with `populate.py`.
## 2023-03-20 Various fixes and changes in resistor colors
diff --git a/kibot/PcbDraw/plot.py b/kibot/PcbDraw/plot.py
index 8ca660e6..a262732b 100644
index 8ca660e6..9dc45ba9 100644
--- a/kibot/PcbDraw/plot.py
+++ b/kibot/PcbDraw/plot.py
@@ -56,6 +56,8 @@ default_style = {
@@ -18,6 +18,7 @@ from . import np
from .unit import read_resistance
from lxml import etree, objectify # type: ignore
from .pcbnew_transition import KICAD_VERSION, isV6, isV7, pcbnew # type: ignore
+from ..gs import GS
T = TypeVar("T")
Numeric = Union[int, float]
@@ -56,6 +57,8 @@ default_style = {
7: '#cc00cc',
8: '#666666',
9: '#cccccc',
@ -231,7 +239,7 @@ index 8ca660e6..a262732b 100644
'1%': '#805500',
'2%': '#ff0000',
'0.5%': '#00cc11',
@@ -64,6 +66,7 @@ default_style = {
@@ -64,6 +67,7 @@ default_style = {
'0.05%': '#666666',
'5%': '#ffc800',
'10%': '#d9d9d9',
@ -239,7 +247,7 @@ index 8ca660e6..a262732b 100644
}
}
@@ -884,10 +887,15 @@ class PlotComponents(PlotInterface):
@@ -884,10 +888,15 @@ class PlotComponents(PlotInterface):
try:
res, tolerance = self._get_resistance_from_value(value)
power = math.floor(res.log10()) - 1
@ -258,27 +266,26 @@ index 8ca660e6..a262732b 100644
self._plotter.get_style("tht-resistor-band-colors", int(power)),
self._plotter.get_style("tht-resistor-band-colors", tolerance)
]
@@ -914,7 +922,7 @@ class PlotComponents(PlotInterface):
@@ -914,7 +923,7 @@ class PlotComponents(PlotInterface):
return
def _get_resistance_from_value(self, value: str) -> Tuple[Decimal, str]:
- res, tolerance = None, "5%"
+ res, tolerance = None, "20%"
+ res, tolerance = None, str(GS.global_default_resistor_tolerance)+"%"
value_l = value.split(" ", maxsplit=1)
try:
res = read_resistance(value_l[0])
@@ -1084,6 +1092,11 @@ class PcbPlotter():
@@ -1084,6 +1093,12 @@ class PcbPlotter():
lib = str(footprint.GetFPID().GetLibNickname()).strip()
name = str(footprint.GetFPID().GetLibItemName()).strip()
value = footprint.GetValue().strip()
+ # Look for a tolerance in the properties
+ prop = footprint.GetProperties()
+ tol = prop.get('tol', prop.get('tolerance', None))
+ if tol:
+ value = value+' '+tol
+ if not LEGACY_KICAD:
+ # Look for a tolerance in the properties
+ prop = footprint.GetProperties()
+ tol = next(filter(lambda x: x, map(prop.get, GS.global_field_tolerance)), None)
+ if tol:
+ value = value+' '+tol
ref = footprint.GetReference().strip()
center = footprint.GetPosition()
orient = math.radians(footprint.GetOrientation().AsDegrees())

View File

@ -18,6 +18,7 @@ from . import np
from .unit import read_resistance
from lxml import etree, objectify # type: ignore
from .pcbnew_transition import KICAD_VERSION, isV6, isV7, pcbnew # type: ignore
from ..gs import GS
T = TypeVar("T")
Numeric = Union[int, float]
@ -922,7 +923,7 @@ class PlotComponents(PlotInterface):
return
def _get_resistance_from_value(self, value: str) -> Tuple[Decimal, str]:
res, tolerance = None, "20%"
res, tolerance = None, str(GS.global_default_resistor_tolerance)+"%"
value_l = value.split(" ", maxsplit=1)
try:
res = read_resistance(value_l[0])
@ -1095,7 +1096,7 @@ class PcbPlotter():
if not LEGACY_KICAD:
# Look for a tolerance in the properties
prop = footprint.GetProperties()
tol = prop.get('tol', prop.get('tolerance', None))
tol = next(filter(lambda x: x, map(prop.get, GS.global_field_tolerance)), None)
if tol:
value = value+' '+tol
ref = footprint.GetReference().strip()

View File

@ -266,6 +266,14 @@ class Globals(FiltersOptions):
this flag """
self.colored_tht_resistors = True
""" Try to add color bands to the 3D models of KiCad THT resistors """
self.field_tolerance = Optionable
""" [string|list(string)] Name/s of the field/s used for the tolerance.
Used while creating colored resistors.
The default is ['tol', 'tolerance'] """
self.default_resistor_tolerance = 20
""" When no tolerance is specified we use this value.
Note that I know 5% is a common default, but technically speaking 20% is the default.
Used while creating colored resistors """
self.set_doc('filters', " [list(dict)] KiBot warnings to be ignored ")
self._filter_what = 'KiBot warnings'
self.filters = FilterOptionsKiBot
@ -374,6 +382,7 @@ class Globals(FiltersOptions):
if GS.ki6 and GS.pcb_file and os.path.isfile(GS.pcb_file):
self.get_stack_up()
super().config(parent)
self.field_tolerance = Optionable.force_list(self.field_tolerance, default=['tol', 'tolerance'])
# Transfer options to the GS globals
for option in filter(lambda x: x[0] != '_', self.__dict__.keys()):
gl = 'global_'+option

View File

@ -130,6 +130,7 @@ class GS(object):
global_csv_accept_no_ref = None
global_date_format = None
global_date_time_format = None
global_default_resistor_tolerance = None
global_drc_exclusions_workaround = None
global_dir = None
global_disable_3d_alias_as_env = None
@ -139,6 +140,7 @@ class GS(object):
global_extra_pth_drill = None
global_field_3D_model = None
global_field_lcsc_part = None
global_field_tolerance = None
global_hide_excluded = None
global_impedance_controlled = None
global_kiauto_time_out_scale = None

View File

@ -414,12 +414,12 @@ class Optionable(object):
return Optionable.expand_filename_both(self, name)
@staticmethod
def force_list(val, comma_sep=True, lower_case=False):
def force_list(val, comma_sep=True, lower_case=False, default=None):
""" Used for values that accept a string or a list of strings.
The string can be a comma separated list """
if isinstance(val, type):
# Not used
val = []
val = [] if default is None else default
elif isinstance(val, str):
# A string
if val:

View File

@ -342,11 +342,10 @@ class Base3DOptions(VariantOptions):
r_len = float(m.group(1))
# THT Resistor that we want to add colors
# Check the tolerance
# TODO: Configurable
tol = c.get_field_value('tol') or c.get_field_value('tolerance')
tol = next(filter(lambda x: x, map(c.get_field_value, GS.global_field_tolerance)), None)
if not tol:
tol = 20
logger.warning(W_BADTOL+'Missing tolerance for {}, using 20%'.format(c.ref))
tol = GS.global_default_resistor_tolerance
logger.warning(W_BADTOL+'Missing tolerance for {}, using {}%'.format(c.ref, tol))
else:
tol = tol.strip()
if tol[-1] == '%':
@ -397,7 +396,7 @@ class Base3DOptions(VariantOptions):
# Make sure we don't have digits that can't be represented
rest = val_str[dig_bars:]
if rest and not all(map(lambda x: x == '0', rest)):
logger.warning(W_RESVALISSUE+'Digits not represented in {} {}'.format(c.ref, c.value))
logger.warning(W_RESVALISSUE+'Digits not represented in {} {} ({} %)'.format(c.ref, c.value, tol))
bars[nbars-1] = tol_color
# For 20% remove the last bar
if tol_color == 12:

View File

@ -2,6 +2,9 @@
kibot:
version: 1
# globals:
# default_resistor_tolerance: 5
outputs:
- name: '3d_default'
comment: "3D view"