Beispiel #1
0
 def uniqueId(self, old_id, make_new_id=True):
     self._deprecated(
         'uniqueId',
         _('{} is now a method in the SvgDocumentElement class. '
           ' Use `self.svg.get_unique_id(old_id)` instead.'))
     return self.svg.get_unique_id(old_id)
Beispiel #2
0
 def getDocumentWidth(self):
     self._deprecated(
         'getDocumentWidth',
         _('{} is now a property of the SvgDocumentElement class. '
           'Use `self.svg.width` instead.'))
     return self.svg.get('width')
 def selected(self):
     self._deprecated(
         'selected',
         _('{} is now a dict in the svg. Use `self.svg.selected`.'))
     return self.svg.selected
Beispiel #4
0
    def effect(self):
        if np is None:
            raise inkex.AbortExtension(
                _("Failed to import the numpy or numpy.linalg modules."
                  " These modules are required by this extension. Please install them."
                  "  On a Debian-like system this can be done with the command, "
                  "sudo apt-get install python-numpy."))
        if len(self.svg.selection) != 2:
            raise inkex.AbortExtension(
                _("This extension requires two selected objects."))

        obj, envelope = self.svg.selection

        if isinstance(obj, (inkex.PathElement, inkex.Group)):
            if isinstance(envelope, inkex.PathElement):
                path = envelope.path.transform(
                    envelope.composed_transform()).to_superpath()

                if len(path) < 1 or len(path[0]) < 4:
                    raise inkex.AbortExtension(
                        _("This extension requires that the second path be four nodes long."
                          ))

                dip = np.zeros((4, 2), dtype=FLOAT)
                for i in range(4):
                    dip[i][0] = path[0][i][1][0]
                    dip[i][1] = path[0][i][1][1]

                # Get bounding box plus any extra composed transform of parents.
                bbox = obj.bounding_box(obj.getparent().composed_transform())

                sip = np.array(
                    [[bbox.left, bbox.bottom], [bbox.left, bbox.top],
                     [bbox.right, bbox.top], [bbox.right, bbox.bottom]],
                    dtype=FLOAT)
            else:
                if isinstance(envelope, inkex.Group):
                    raise inkex.AbortExtension(
                        _("The second selected object is a group, not a"
                          " path.\nTry using Object->Ungroup."))
                raise inkex.AbortExtension(
                    _("The second selected object is not a path.\nTry using"
                      " the procedure Path->Object to Path."))
        else:
            raise inkex.AbortExtension(
                _("The first selected object is neither a path nor a group.\nTry using"
                  " the procedure Path->Object to Path."))

        solmatrix = np.zeros((8, 8), dtype=FLOAT)
        free_term = np.zeros(8, dtype=FLOAT)
        for i in (0, 1, 2, 3):
            solmatrix[i][0] = sip[i][0]
            solmatrix[i][1] = sip[i][1]
            solmatrix[i][2] = 1
            solmatrix[i][6] = -dip[i][0] * sip[i][0]
            solmatrix[i][7] = -dip[i][0] * sip[i][1]
            solmatrix[i + 4][3] = sip[i][0]
            solmatrix[i + 4][4] = sip[i][1]
            solmatrix[i + 4][5] = 1
            solmatrix[i + 4][6] = -dip[i][1] * sip[i][0]
            solmatrix[i + 4][7] = -dip[i][1] * sip[i][1]
            free_term[i] = dip[i][0]
            free_term[i + 4] = dip[i][1]

        res = lin.solve(solmatrix, free_term)
        projmatrix = np.array(
            [[res[0], res[1], res[2]], [res[3], res[4], res[5]],
             [res[6], res[7], 1.0]],
            dtype=FLOAT)

        self.process_object(obj, projmatrix)
Beispiel #5
0
 def addDocumentUnit(self, value):
     self._deprecated(
         'addDocumentUnit',
         _('{} is now a method in the SvgDocumentElement class. '
           'Use `self.svg.add_unit(value)` instead.'))
     return self.svg.add_unit(value)
 def current_layer(self):
     self._deprecated(
         'current_layer',
         _('{} is now a method in the svg. Use `self.svg.get_current_layer()` instead.'
           ))
     return self.svg.get_current_layer()
Beispiel #7
0
 def xpathSingle(self, xpath):
     self._deprecated(
         'xpathSingle',
         _('{} is now a new method in the SvgDocumentElement class. '
           'Use `self.svg.getElement(path)` instead.'))
     return self.svg.getElement(xpath)
Beispiel #8
0
 def unittouu(self, string):
     self._deprecated(
         'unittouu',
         _('{} is now a method in the SvgDocumentElement class. '
           'Use `self.svg.unittouu(str)` instead.'))
     return self.svg.unittouu(string)
Beispiel #9
0
 def getselected(self):
     self._deprecated('getselected', _('{} has been removed'))
Beispiel #10
0
 def getElementById(self, eid):
     self._deprecated('getElementById',\
         _('{} is now a method in the SvgDocumentElement class. Use `self.svg.getElementById(eid)` instead.'))
     return self.svg.getElementById(eid)
Beispiel #11
0
 def selected(self):
     self._deprecated(
         'selected',
         _('{} is now a dict in the SvgDocumentElement class. Use `self.svg.selected`.'
           ))
     return dict([(elem.get('id'), elem) for elem in self.svg.selected])
Beispiel #12
0
 def view_center(self):
     self._deprecated('view_center',\
         _('{} is now a method in the SvgDocumentElement class. Use `self.svg.get_center_position()` instead.'))
     return self.svg.namedview.center
Beispiel #13
0
 def current_layer(self):
     self._deprecated('current_layer',\
         _('{} is now a method in the SvgDocumentElement class. Use `self.svg.get_current_layer()` instead.'))
     return self.svg.get_current_layer()
Beispiel #14
0
 def getDocumentHeight(self):
     self._deprecated(
         'getDocumentHeight',
         _('{} is now a property of the SvgDocumentElement class. '
           'Use `self.svg.height` instead.'))
     return self.svg.get('height')
Beispiel #15
0
 def getParentNode(self, node):
     self._deprecated('getParentNode',\
         _('{} is no longer in use. Use the lxml `.getparent()` method instead.'))
     return node.getparent()
Beispiel #16
0
 def getDocumentUnit(self):
     self._deprecated(
         'getDocumentUnit',
         _('{} is now a property of the SvgDocumentElement class. '
           'Use `self.svg.unit` instead.'))
     return self.svg.unit
Beispiel #17
0
 def getNamedView(self):
     self._deprecated('getNamedView',\
         _('{} is now a property of the SvgDocumentElement class. '
           'Use `self.svg.namedview` to access this element.'))
     return self.svg.namedview
Beispiel #18
0
 def uutounit(self, val, unit):
     self._deprecated(
         'uutounit',
         _('{} is now a method in the SvgDocumentElement class. '
           'Use `self.svg.uutounit(value, unit)` instead.'))
     return self.svg.uutounit(val, unit)
Beispiel #19
0
 def createGuide(self, posX, posY, angle):
     from .elements import Guide
     self._deprecated('createGuide',\
         _('{} is now a method of the namedview element object. '
           'Use `self.svg.namedview.add(Guide().move_to(x, y, a))` instead.'))
     return self.svg.namedview.add(Guide().move_to(posX, posY, angle))
 def effect(self):
     self._deprecated(
         'effect',
         _('{} method is now a required method. It should '
           'be created on {cls}, even if it does nothing.'))
Beispiel #21
0
 def args(self):
     self._deprecated('args',
                      _('self.args[-1] is now self.options.input_file.'))
     return self._args
 def view_center(self):
     self._deprecated(
         'view_center',
         _('{} is now a method in the svg. Use `self.svg.namedview.center` instead.'
           ))
     return self.svg.namedview.center
Beispiel #23
0
 def svg_file(self):
     self._deprecated('svg_file',
                      _('self.svg_file is now self.options.input_file.'))
     return self.options.input_file
 def getdocids(self):
     self._deprecated(
         'getdocids',
         _('Use `self.svg.get_ids()` instead of {} and `doc_ids`.'))
     self._doc_ids = None
     self.svg.ids.clear()
Beispiel #25
0
    def save(self, stream):

        pngs = OrderedDict()
        valid = False

        for node in self.svg.xpath("/svg:svg/*[name()='g' or @style][@id]"):
            if not len(node):  # pylint: disable=len-as-condition
                # Ignore empty layers
                continue

            valid = True
            node_id = node.get('id')
            name = node.get("inkscape:label", node_id)

            pngs[name] = take_snapshot(self.document,
                                       dirname=self.tempdir,
                                       name=name,
                                       dpi=int(self.options.dpi),
                                       export_id=node_id,
                                       export_id_only=True,
                                       export_area_page=True,
                                       export_background_opacity=int(
                                           bool(self.options.background)))

        if not valid:
            inkex.errormsg(
                _('This extension requires at least one non empty layer.'))
            return

        xcf = os.path.join(self.tempdir, "{}.xcf".format(self.docname))
        script_fu = """
(tracing 1)
(define
  (png-to-layer img png_filename layer_name)
  (let*
    (
      (png (car (file-png-load RUN-NONINTERACTIVE png_filename png_filename)))
      (png_layer (car (gimp-image-get-active-layer png)))
      (xcf_layer (car (gimp-layer-new-from-drawable png_layer img)))
    )
    (gimp-image-add-layer img xcf_layer -1)
    (gimp-drawable-set-name xcf_layer layer_name)
  )
)
(let*
  (
    (img (car (gimp-image-new 200 200 RGB)))
  )
  (gimp-image-set-resolution img {dpi} {dpi})
  (gimp-image-undo-disable img)
  (for-each
    (lambda (names)
      (png-to-layer img (car names) (cdr names))
    )
    (map cons '("{files}") '("{names}"))
  )

  (gimp-image-resize-to-layers img)
""".format(dpi=self.options.dpi,
           files='" "'.join(pngs.values()),
           names='" "'.join(list(pngs)))

        if self.options.guides:
            for dim, guides in self.get_guides():
                script_fu += """
  (for-each
    (lambda ({d}Guide)
      (gimp-image-add-{d}guide img {d}Guide)
    )
    '({g})
  )""".format(d=dim, g=guides)

        # Grid
        if self.options.grid:
            for fu_let in self.get_grid():
                script_fu += "\n" + fu_let + "\n"

        script_fu += """
  (gimp-image-undo-enable img)
  (gimp-file-save RUN-NONINTERACTIVE img (car (gimp-image-get-active-layer img)) "{xcf}" "{xcf}"))
(gimp-quit 0)
            """.format(xcf=xcf)

        call('gimp',
             "-b",
             "-",
             i=True,
             batch_interpreter="plug-in-script-fu-eval",
             stdin=script_fu)

        with open(xcf, 'rb') as fhl:
            stream.write(fhl.read())