kopia lustrzana https://github.com/inkstitch/inkstitch
Lpe Satin: objects to paths (#2213)
* lpe satin: objects to paths * option to link path effects on multiple objects or to use independentlypull/2127/head
rodzic
3ef31628cb
commit
6273393b90
|
|
@ -611,11 +611,11 @@ export default {
|
|||
this.svg.on('zoom', this.resizeCursor)
|
||||
this.resizeCursor()
|
||||
|
||||
inkStitch.get('page_specs').then(response => {
|
||||
this.page_specs = response.data
|
||||
this.generatePage()
|
||||
})
|
||||
this.start()
|
||||
})
|
||||
inkStitch.get('page_specs').then(response => {
|
||||
this.page_specs = response.data
|
||||
this.generatePage()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ class StrokeToLpeSatin(InkstitchExtension):
|
|||
self.arg_parser.add_argument("-l", "--length", type=float, default=15, dest="length")
|
||||
self.arg_parser.add_argument("-t", "--stretched", type=inkex.Boolean, default=False, dest="stretched")
|
||||
self.arg_parser.add_argument("-r", "--rungs", type=inkex.Boolean, default=False, dest="add_rungs")
|
||||
self.arg_parser.add_argument("-s", "--path-specific", type=inkex.Boolean, default=True, dest="path_specific")
|
||||
|
||||
def effect(self):
|
||||
if not self.svg.selection or not self.get_elements():
|
||||
|
|
@ -52,48 +53,79 @@ class StrokeToLpeSatin(InkstitchExtension):
|
|||
pattern_path = pattern_obj.get_path(self.options.add_rungs, min_width, max_width, length, self.svg.unit)
|
||||
pattern_node_type = pattern_obj.node_types
|
||||
|
||||
if not self.options.path_specific:
|
||||
lpe = self._create_lpe_element(pattern, pattern_path, pattern_node_type)
|
||||
|
||||
for element in self.elements:
|
||||
if self.options.path_specific:
|
||||
lpe = self._create_lpe_element(pattern, pattern_path, pattern_node_type, element)
|
||||
if isinstance(element, SatinColumn):
|
||||
self._process_satin_column(element, lpe)
|
||||
elif isinstance(element, Stroke):
|
||||
self._process_stroke(element, lpe)
|
||||
|
||||
def _create_lpe_element(self, pattern, pattern_path, pattern_node_type, element=None):
|
||||
# define id for the lpe path
|
||||
if not element:
|
||||
lpe_id = f'inkstitch-effect-{pattern}'
|
||||
else:
|
||||
lpe_id = f'inkstitch-effect-{pattern}-{element.id}'
|
||||
|
||||
# it is possible, that there is already a path effect with this id, if so, use it
|
||||
previous_lpe = self.svg.getElementById(lpe_id)
|
||||
if previous_lpe is not None:
|
||||
return previous_lpe
|
||||
|
||||
# the lpe 'pattern along path' has two options to repeat the pattern, get user input
|
||||
copy_type = 'repeated' if self.options.stretched is False else 'repeated_stretched'
|
||||
|
||||
lpe = inkex.PathEffect(attrib={'id': lpe_id,
|
||||
'effect': "skeletal",
|
||||
'is_visible': "true",
|
||||
'lpeversion': "1",
|
||||
'pattern': pattern_path,
|
||||
'copytype': copy_type,
|
||||
'prop_scale': "1",
|
||||
'scale_y_rel': "false",
|
||||
'spacing': "0",
|
||||
'normal_offset': "0",
|
||||
'tang_offset': "0",
|
||||
'prop_units': "false",
|
||||
'vertical_pattern': "false",
|
||||
'hide_knot': "false",
|
||||
'fuse_tolerance': "0.02",
|
||||
'pattern-nodetypes': pattern_node_type})
|
||||
# add the path effect element to the defs section
|
||||
self.lpe = inkex.PathEffect(attrib={'id': f'inkstitch-effect-{pattern}',
|
||||
'effect': "skeletal",
|
||||
'is_visible': "true",
|
||||
'lpeversion': "1",
|
||||
'pattern': pattern_path,
|
||||
'copytype': copy_type,
|
||||
'prop_scale': "1",
|
||||
'scale_y_rel': "false",
|
||||
'spacing': "0",
|
||||
'normal_offset': "0",
|
||||
'tang_offset': "0",
|
||||
'prop_units': "false",
|
||||
'vertical_pattern': "false",
|
||||
'hide_knot': "false",
|
||||
'fuse_tolerance': "0.02",
|
||||
'pattern-nodetypes': pattern_node_type})
|
||||
self.svg.defs.add(self.lpe)
|
||||
self.svg.defs.add(lpe)
|
||||
return lpe
|
||||
|
||||
for element in self.elements:
|
||||
if isinstance(element, SatinColumn):
|
||||
self._process_satin_column(element)
|
||||
elif isinstance(element, Stroke):
|
||||
self._process_stroke(element)
|
||||
def _process_stroke(self, element, lpe):
|
||||
element = self._ensure_path_element(element, lpe)
|
||||
|
||||
def _process_stroke(self, element):
|
||||
previous_effects = element.node.get(PATH_EFFECT, None)
|
||||
if not previous_effects:
|
||||
element.node.set(PATH_EFFECT, self.lpe.get_id(as_url=1))
|
||||
element.node.set(PATH_EFFECT, lpe.get_id(as_url=1))
|
||||
element.node.set(ORIGINAL_D, element.node.get('d', ''))
|
||||
else:
|
||||
url = previous_effects + ';' + self.lpe.get_id(as_url=1)
|
||||
url = previous_effects + ';' + lpe.get_id(as_url=1)
|
||||
element.node.set(PATH_EFFECT, url)
|
||||
element.node.pop('d')
|
||||
element.set_param('satin_column', 'true')
|
||||
|
||||
element.node.style['stroke-width'] = self.svg.viewport_to_unit('0.756')
|
||||
|
||||
def _process_satin_column(self, element):
|
||||
def _ensure_path_element(self, element, lpe):
|
||||
# elements other than paths (rectangle, circles, etc.) can be handled by inkscape for lpe
|
||||
# but they are way easier to handle for us if we turn them into paths
|
||||
if element.node.TAG == 'path':
|
||||
return element
|
||||
|
||||
path_element = element.node.to_path_element()
|
||||
parent = element.node.getparent()
|
||||
parent.replace(element.node, path_element)
|
||||
return Stroke(path_element)
|
||||
|
||||
def _process_satin_column(self, element, lpe):
|
||||
current_effects = element.node.get(PATH_EFFECT, None)
|
||||
# there are possibly multiple path effects, let's check if inkstitch-effect is among them
|
||||
if not current_effects or 'inkstitch-effect' not in current_effects:
|
||||
|
|
@ -106,10 +138,11 @@ class StrokeToLpeSatin(InkstitchExtension):
|
|||
inkstitch_effect = current_effects[inkstitch_effect_position][1:]
|
||||
# get the path effect element
|
||||
old_effect_element = self.svg.getElementById(inkstitch_effect)
|
||||
# remove the old inkstitch-effect
|
||||
old_effect_element.getparent().remove(old_effect_element)
|
||||
# update the path effect link
|
||||
current_effects[inkstitch_effect_position] = self.lpe.get_id(as_url=1)
|
||||
# remove the old inkstitch-effect if it is path specific
|
||||
if inkstitch_effect.endswith(element.id):
|
||||
old_effect_element.getparent().remove(old_effect_element)
|
||||
# update path effect link
|
||||
current_effects[inkstitch_effect_position] = lpe.get_id(as_url=1)
|
||||
element.node.set(PATH_EFFECT, ';'.join(current_effects))
|
||||
element.node.pop('d')
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@
|
|||
<param name="length" type="float" precision="1" min="0.1" max="100" gui-text="Pattern Length (mm)">15</param>
|
||||
<param name="stretched" type="boolean" gui-text="Stretched">false</param>
|
||||
<param name="rungs" type="boolean" gui-text="Add rungs">true</param>
|
||||
<param name="path-specific" type="boolean" gui-text="Path specific"
|
||||
description="When disabled, changes on the path effect will apply to all elements with the same path effect.">true</param>
|
||||
</page>
|
||||
<page name="info" gui-text="Help">
|
||||
<label appearance="header">This extension converts a stroke into a satin column using the path effect "pattern along path".</label>
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue