Inkscape.org
Creating New Extensions Help with old close curves extension.
  1. #1
    Raghavendra Kamath Raghavendra Kamath @raghukamath
    *

    I found an extension called closed curves. Which helped in closing paths. Here is the link for this extension on a different forum. Pasting the message from the forum for convenience:

    This is an Inkscape extension that closes all open curves in the selection.
    It may be useful when you want to use curves in other programs such OpenOffice. OpenOffice wont fill path if it isn't closed one. Also if you convert text to curve, you can see some trash in the outline because curves are not closed (see attached pictures).

    Close curves inkscape extension

    This extension works with paths. It modifies path's d parameter. It adds a 'z' just before each 'm' if it's not the first one in the line or there's already 'z' before it.

    The code is here :

    close_curves.inx

     

    <?xml version="1.0" encoding="UTF-8"?>
    <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
    	<_name>Close curves</_name>
    	<id>ru.cnc-club.filter.close_curves</id>
    	<dependency type="executable" location="extensions">close_curves.py</dependency>
    	<dependency type="executable" location="extensions">inkex.py</dependency>
    	<param name="help" type="description">
    		Select paths that you want to close, and press ok.
    	</param>
    	<effect needs-live-preview="false">
    		 <effects-menu>
                <submenu _name="Modify Path"/>
            </effects-menu>
    		<object-type>path</object-type>
    	</effect>
    	<script>
    		<command reldir="extensions" interpreter="python">close_curves.py</command>
    	</script>
    </inkscape-extension>

    close_curves.py

    #!/usr/bin/env python 
    """
    Copyright (C) 2009 Nick Drobchenko, nick@cnc-club.ru
    based on gcode.py (C) 2007 hugomatic... 
    based on addnodes.py (C) 2005,2007 Aaron Spike, aaron@ekips.org
    based on dots.py (C) 2005 Aaron Spike, aaron@ekips.org
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    """
    
    #	
    #	This extension close paths by adding 'z' before each 'm' if it is not
    #	the first 'm' and it is not prepended by 'z' already.
    #
    
    import inkex, re, simplepath
    			
    class CloseCurves(inkex.Effect):
    	def __init__(self):
    		inkex.Effect.__init__(self)
    	def effect(self):
    		for id, node in self.selected.iteritems():
    			if node.tag == inkex.addNS('path','svg'):
    				d = node.get('d')
    				d = simplepath.formatPath( simplepath.parsePath(d) )
    				d = re.sub(r'(?i)(m[^mz]+)',r'\1 Z ',d)
    				d = re.sub(r'(?i)\s*z\s*z\s*',r' Z ',d)
    				node.set('d', d)	
    
    	
    e = CloseCurves()
    e.affect()

    I installed the extension is correct place but when I run it it gives an error regarding the iteritems

    /home/username/.config/inkscape/extensions/close_curves.py:44: DeprecationWarning: Effect.affect is now `Effect.run()`. The `output` argument has changed.
      e.affect()
    /home/username/.config/inkscape/extensions/close_curves.py:34: DeprecationWarning: Effect.selected is now a dict in the svg. Use `self.svg.selected`.
      for id, node in self.selected.iteritems():
    Traceback (most recent call last):
      File "/home/username/.config/inkscape/extensions/close_curves.py", line 44, in <module>
        e.affect()
      File "/usr/share/inkscape/extensions/inkex/deprecated.py", line 181, in affect
        return self.run(args=args)
      File "/usr/share/inkscape/extensions/inkex/base.py", line 140, in run
        self.save_raw(self.effect())
      File "/home/username/.config/inkscape/extensions/close_curves.py", line 34, in effect
        for id, node in self.selected.iteritems():
    AttributeError: 'dict' object has no attribute 'iteritems'

    Can someone knowledgeable with python help in fixing this extension?

    Thank you

  2. #2
    Ellen Wasbø Ellen Wasbø @EllenWasbo

    This code is not updated for Inkscape v1.0+. I updated a very similar extension of mine (doing the opposite - opening paths). Replace the Python code with this and it should work:

    import inkex, re
                
    class CloseCurves(inkex.EffectExtension):

        def effect(self):
            for elem in self.svg.get_selected():
                d=str(elem.path)
                d = re.sub(r'(?i)(m[^mz]+)',r'\1 Z ',d)
                d = re.sub(r'(?i)\s*z\s*z\s*',r' Z ',d)
                elem.path = d
        
    if __name__ == '__main__':
        CloseCurves().run()

     

  3. #3
    Raghavendra Kamath Raghavendra Kamath @raghukamath

    Thank you very much that indeed fixes it. Thank you once again.

  4. #4
    Ellen Wasbø Ellen Wasbø @EllenWasbo

    Good to hear that it worked for you :)

Inkscape Inkscape.org Inkscape Forum Creating New Extensions Help with old close curves extension.