jaseg 2023-07-21 14:38:09 +02:00
rodzic a39af853c8
commit 21ca5f7f5c
3 zmienionych plików z 88 dodań i 45 usunięć

Wyświetl plik

@ -325,9 +325,33 @@ class TextMixin:
for line in self.render():
yield f'M {line.x1:.3f} {line.y1:.3f} L {line.x2:.3f} {line.y2:.3f}'
def to_svg(self, color='black'):
d = ' '.join(self.svg_path_data())
yield Tag('path', d=d, fill='none', stroke=color, stroke_width=f'{self.line_width:.3f}', stroke_linecap='round')
@property
def default_v_align(self):
return 'bottom'
@property
def h_align(self):
return 'left' if self.effects.justify.h else 'center'
def to_svg(self, color='black', variables={}):
if not self.effects or self.effects.hide or not self.effects.font:
return
font = Newstroke.load()
text = string.Template(self.text).safe_substitute(variables)
aperture = ap.CircleAperture(self.line_width or 0.2, unit=MM)
if text == 'H3LIS100DL':
print(text, self.rotation, self.at, self.effects)
yield font.render_svg(text,
size=self.size or 1.27,
rotation=self.rotation,
h_align=self.h_align,
v_align=self.effects.justify.v or self.default_v_align,
stroke=color,
stroke_width=f'{self.line_width:.3f}',
scale=(1,1),
transform=f'translate({self.at.x:.3f} {self.at.y:.3f})',
)
@property
def _text_offset(self):
@ -343,50 +367,23 @@ class TextMixin:
font = Newstroke.load()
text = string.Template(self.text).safe_substitute(variables)
strokes = list(font.render(text, size=self.size))
min_x = min(x for st in strokes for x, y in st)
min_y = min(y for st in strokes for x, y in st)
max_x = max(x for st in strokes for x, y in st)
max_y = max(y for st in strokes for x, y in st)
w = max_x - min_x
h = max_y - min_y
h_just = self.effects.justify.h if self.effects.justify else None
v_just = self.effects.justify.v if self.effects.justify else None
rot = self.rotation
# KiCad already flips h_just in these cases, making the rotation param redundant.
if rot == 180:
rot = 0
if rot == 270 and self.at.rotation != 270:
h_just = {Atom.right: Atom.left, Atom.left: Atom.right}.get(h_just, h_just)
offx, offy = self._text_offset
offx += -min_x + {
None: -w/2,
Atom.right: -w,
Atom.left: 0
}[h_just]
offy += {
None: self.size/2,
Atom.top: self.size,
Atom.bottom: 0
}[v_just]
aperture = ap.CircleAperture(self.line_width or 0.2, unit=MM)
for stroke in strokes:
out = []
for stroke in font.render(text,
x0=self.at.x, y=self.at.y,
size=self.size or 1.27,
h_align=self.effects.justify.h_str,
v_align=self.effects.justify.v_str,
rotation=self.at.rotation,
):
points = []
for x, y in stroke:
x, y = x+offx, y+offy
x, y = rotate_point(x, y, math.radians(-rot or 0))
x, y = x+self.at.x, y+self.at.y
out.append((x, y))
points.append((x, y))
for p1, p2 in zip(out[:-1], out[1:]):
for p1, p2 in zip(points[:-1], points[1:]):
yield go.Line(*p1, *p2, aperture=aperture, unit=MM)

Wyświetl plik

@ -302,9 +302,26 @@ class DrawnProperty(TextMixin):
def text(self, value):
self.value = value
@property
def default_v_align(self):
return 'middle'
@property
def h_align(self):
return self.effects.justify.h_str
@property
def rotation(self):
return self.parent.rotation + self.at.rotation
rot = -self.at.rotation
rot += getattr(self.parent.at, 'rotation', 0)
if getattr(self.parent, 'reference', None) == 'C13':
print(self.value, self.at, self.parent.at, self.parent.mirror)
if hasattr(self.parent, 'mirror'):
if self.parent.mirror.y and rot in (90, 270):
rot = (rot+180)%360
if self.parent.mirror.x and rot in (0, 180):
rot = (rot+180)%360
return rot%360
def to_svg(self, colorscheme=Colorscheme.KiCad):
if not self.hide:
@ -336,6 +353,35 @@ class SymbolInstance:
def __after_parse__(self, parent):
self.schematic = parent
@property
def reference(self):
return self['Reference'].value
@reference.setter
def reference(self, value):
self['Reference'].value = value
@property
def value(self):
return self['Value'].value
@value.setter
def value(self, value):
self['Value'].value = value
@property
def footprint(self):
return self['Footprint'].value
@footprint.setter
def footprint(self, value):
self['Footprint'].value = value
def __getitem__(self, key):
for prop in self.properties:
if prop.key == key:
return prop
@property
def rotation(self):
return self.at.rotation

Wyświetl plik

@ -58,9 +58,9 @@ class Newstroke:
raise ValueError(f'Invalid h_align value "{h_align}"')
if v_align == 'top':
aly = -1.2*size
aly = sy*1.2*size
elif v_align == 'middle':
aly = -1.2*size/2
aly = sy*1.2*size/2
elif v_align != 'bottom':
raise ValueError(f'Invalid v_align value "{v_align}"')
@ -77,7 +77,7 @@ class Newstroke:
x += glyph_w*size
def render_svg(self, text, size=1.0, x0=0, y0=0, rotation=0, h_align='left', v_align='bottom', space_width=DEFAULT_SPACE_WIDTH, char_gap=DEFAULT_CHAR_GAP, **svg_attrs):
def render_svg(self, text, size=1.0, x0=0, y0=0, rotation=0, h_align='left', v_align='bottom', space_width=DEFAULT_SPACE_WIDTH, char_gap=DEFAULT_CHAR_GAP, scale=(1, -1), **svg_attrs):
if 'stroke_linecap' not in svg_attrs:
svg_attrs['stroke_linecap'] = 'round'
if 'stroke_linejoin' not in svg_attrs:
@ -89,7 +89,7 @@ class Newstroke:
strokes = ['M ' + ' L '.join(f'{x:.3f} {y:.3f}' for x, y in stroke)
for stroke in self.render(text, size=size, x0=x0, y0=y0, rotation=rotation, h_align=h_align,
v_align=v_align, space_width=space_width, char_gap=char_gap,
scale=(1, -1))]
scale=scale)]
return Tag('path', d=' '.join(strokes), **svg_attrs)
def bounding_box(self, text, size=1.0, space_width=DEFAULT_SPACE_WIDTH, char_gap=DEFAULT_CHAR_GAP):