View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0017154 | Scribus | Scripter | public | 2024-02-06 08:47 | 2024-02-07 01:27 |
Reporter | Zinal | Assigned To | |||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | new | Resolution | open | ||
Product Version | 1.7.0.svn | ||||
Summary | 0017154: Allow setting Gradient Vectors from code/console | ||||
Description | We are able to set a gradient fill and add gradient stops through code (console) but there is currently no method to set the vectors, focal point, scale nor skew. It would be quite easy to create a method to at least set the start/end vectors.. Something like this: PyObject *scribus_setgradvectors(PyObject* /* self */, PyObject* args) { char* Name = const_cast<char*>(""); double startX, startY, endX, endY; if (!PyArg_ParseTuple(args, "dddd|es", &startX, &startY, &endX, &endY, "utf-8", &Name)) return nullptr; if (!checkHaveDocument()) return nullptr; PageItem* currItem = GetUniqueItem(QString::fromUtf8(Name)); if (currItem == nullptr) return nullptr; currItem->setGradientStart(ValueToPoint(startX), ValueToPoint(startY)); currItem->setGradientEnd(ValueToPoint(endX), ValueToPoint(endY)); currItem->update(); Py_RETURN_NONE; } | ||||
Tags | feature request, gradients, python, scripter | ||||
Patch | No | ||||
|
Works like a charm for me at least! I attached a .diff file which I hope is correct (Github user here.. Never used svn before...) 17154-gradient_vectors.diff (3,010 bytes)
Index: scribus/plugins/scriptplugin/cmdsetprop.cpp =================================================================== --- scribus/plugins/scriptplugin/cmdsetprop.cpp (revision 26024) +++ scribus/plugins/scriptplugin/cmdsetprop.cpp (working copy) @@ -9,6 +9,25 @@ #include "scribuscore.h" #include "scribusdoc.h" +PyObject* scribus_setgradvectors(PyObject* /* self */, PyObject* args) +{ + char* Name = const_cast<char*>(""); + double startX, startY, endX, endY; + if (!PyArg_ParseTuple(args, "dddd|es", &startX, &startY, &endX, &endY, "utf-8", &Name)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + + PageItem* currItem = GetUniqueItem(QString::fromUtf8(Name)); + if (currItem == nullptr) + return nullptr; + + currItem->setGradientStart(ValueToPoint(startX), ValueToPoint(startY)); + currItem->setGradientEnd(ValueToPoint(endX), ValueToPoint(endY)); + currItem->update(); + Py_RETURN_NONE; +} + PyObject *scribus_setgradfill(PyObject* /* self */, PyObject* args) { char *Name = const_cast<char*>(""); Index: scribus/plugins/scriptplugin/cmdsetprop.h =================================================================== --- scribus/plugins/scriptplugin/cmdsetprop.h (revision 26024) +++ scribus/plugins/scriptplugin/cmdsetprop.h (working copy) @@ -13,6 +13,17 @@ /** Setting Object Properties */ /*! docstring */ +PyDoc_STRVAR(scribus_setgradvectors__doc__, + QT_TR_NOOP("setGradientVectors(startX, startY, endX, endY, [\"name\"])\n\ +\n\ +Sets the gradient vectors of the object \"name\" to (startX, startY) -> (endX, endY).\n\ +The coordinates are given in the current measurement units of the document\n\ +(see UNIT constants).\n\ +")); +/*! Set gradient vector */ +PyObject* scribus_setgradvectors(PyObject* /*self*/, PyObject* args); + +/*! docstring */ PyDoc_STRVAR(scribus_setgradfill__doc__, QT_TR_NOOP("setGradientFill(type, \"color1\", shade1, \"color2\", shade2, [\"name\"])\n\ \n\ Index: scribus/plugins/scriptplugin/scriptplugin.cpp =================================================================== --- scribus/plugins/scriptplugin/scriptplugin.cpp (revision 26024) +++ scribus/plugins/scriptplugin/scriptplugin.cpp (working copy) @@ -533,6 +533,7 @@ {const_cast<char*>("setFontSize"), scribus_setfontsize, METH_VARARGS, tr(scribus_setfontsize__doc__)}, {const_cast<char*>("setGradientFill"), scribus_setgradfill, METH_VARARGS, tr(scribus_setgradfill__doc__)}, {const_cast<char*>("setGradientStop"), scribus_setgradstop, METH_VARARGS, tr(scribus_setgradstop__doc__)}, + {const_cast<char*>("setGradientVectors"), scribus_setgradvectors, METH_VARARGS, tr(scribus_setgradvectors__doc__)}, {const_cast<char*>("setHGuides"), scribus_setHguides, METH_VARARGS, tr(scribus_setHguides__doc__)}, {const_cast<char*>("setImageBrightness"), scribus_setimagebrightness, METH_VARARGS, tr(scribus_setimagebrightness__doc__)}, {const_cast<char*>("setImageGrayscale"), scribus_setimagegrayscale, METH_VARARGS, tr(scribus_setimagegrayscale__doc__)}, |
|
i did not try it but at first sight it looks ok... just probably missing a small detail: + << scribus_setgradvectors__doc__ at the end of scribus/plugins/scriptplugin/cmdsetprop.cpp |
|
Forgot about that. I fixed it. I've also added two other methods: getGradientStopsCount(["name"]) -> integer and getGradientStop(index, ["name"]) -> ("color", opacity, shade) for easier manipulation of gradients. 17154-gradient_methods.diff (8,485 bytes)
Index: scribus/plugins/scriptplugin/cmdgetprop.cpp =================================================================== --- scribus/plugins/scriptplugin/cmdgetprop.cpp (revision 26024) +++ scribus/plugins/scriptplugin/cmdgetprop.cpp (working copy) @@ -12,6 +12,58 @@ #include "scribuscore.h" #include "scribusdoc.h" +PyObject* scribus_getgradstop(PyObject* /* self */, PyObject* args) +{ + char* Name = const_cast<char*>(""); + int stopIndex = 0; + if (!PyArg_ParseTuple(args, "i|es", &stopIndex, "utf-8", &Name)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + PageItem* item = GetUniqueItem(QString::fromUtf8(Name)); + if (item == nullptr) + return nullptr; + + int gradStopsCount = item->fill_gradient.stops(); + + if (stopIndex < 0 || stopIndex >= gradStopsCount) + { + PyErr_SetString(PyExc_ValueError, QObject::tr("Stop index out of bounds, must be 0 <= index <= stopsCount.", "python error").toLocal8Bit().constData()); + return nullptr; + } + + VColorStop* stop = item->fill_gradient.colorStops()[stopIndex]; + const char* stopName = stop->name.toUtf8().constData(); + + return Py_BuildValue("(sdi)", stopName, stop->opacity, stop->shade); +} + +PyObject* scribus_getgradstopscount(PyObject* /* self */, PyObject* args) +{ + char* Name = const_cast<char*>(""); + if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + PageItem* item = GetUniqueItem(QString::fromUtf8(Name)); + if (item == nullptr) + return nullptr; + return PyLong_FromLong(static_cast<long>(item->fill_gradient.stops())); +} + +PyObject* scribus_getgradvectors(PyObject* /* self */, PyObject* args) +{ + char* Name = const_cast<char*>(""); + if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + PageItem* item = GetUniqueItem(QString::fromUtf8(Name)); + if (item == nullptr) + return nullptr; + return Py_BuildValue("(ffff)", PointToValue(item->GrStartX), PointToValue(item->GrStartY), PointToValue(item->GrEndX), PointToValue(item->GrEndY)); +} + /* getObjectType(name) */ PyObject *scribus_getobjecttype(PyObject* /* self */, PyObject* args) { @@ -475,6 +527,9 @@ << scribus_getfillblendmode__doc__ << scribus_getfillshade__doc__ << scribus_getfilltransparency__doc__ + << scribus_getgradstop__doc__ + << scribus_getgradstopscount__doc__ + << scribus_getgradvectors__doc__ << scribus_getimagecolorspace__doc__ << scribus_getimagefile__doc__ << scribus_getimageoffset__doc__ Index: scribus/plugins/scriptplugin/cmdgetprop.h =================================================================== --- scribus/plugins/scriptplugin/cmdgetprop.h (revision 26024) +++ scribus/plugins/scriptplugin/cmdgetprop.h (working copy) @@ -12,6 +12,30 @@ /** Query-Functions */ +PyDoc_STRVAR(scribus_getgradstop__doc__, + QT_TR_NOOP("getGradientStop(index, [\"name\"]) -> (\"color\", opacity, shade)\n\ +\n\ +Returns a (\"color\", opacity, shade) tuple containing the stop at index on the gradient of the object\n\ +\"name\". If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject* scribus_getgradstop(PyObject* /*self*/, PyObject* args); + +PyDoc_STRVAR(scribus_getgradstopscount__doc__, + QT_TR_NOOP("getGradientStopsCount([\"name\"]) -> integer\n\ +\n\ +Returns the number of stops on the gradient of the object\n\ +\"name\". If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject* scribus_getgradstopscount(PyObject* /*self*/, PyObject* args); + +PyDoc_STRVAR(scribus_getgradvectors__doc__, +QT_TR_NOOP("getGradientVectors([\"name\"]) -> (startX, startY, endX, endY)\n\ +\n\ +Returns a (startX, startY, endX, endY) tuple containing the gradient vector of the object\n\ +\"name\". If \"name\" is not given the currently selected item is used.\n\ +")); +PyObject* scribus_getgradvectors(PyObject* /*self*/, PyObject* args); + /*! docstring */ PyDoc_STRVAR(scribus_getobjecttype__doc__, QT_TR_NOOP("getObjectType([\"name\"]) -> string\n\ Index: scribus/plugins/scriptplugin/cmdsetprop.cpp =================================================================== --- scribus/plugins/scriptplugin/cmdsetprop.cpp (revision 26024) +++ scribus/plugins/scriptplugin/cmdsetprop.cpp (working copy) @@ -9,6 +9,25 @@ #include "scribuscore.h" #include "scribusdoc.h" +PyObject* scribus_setgradvectors(PyObject* /* self */, PyObject* args) +{ + char* Name = const_cast<char*>(""); + double startX, startY, endX, endY; + if (!PyArg_ParseTuple(args, "dddd|es", &startX, &startY, &endX, &endY, "utf-8", &Name)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + + PageItem* currItem = GetUniqueItem(QString::fromUtf8(Name)); + if (currItem == nullptr) + return nullptr; + + currItem->setGradientStart(ValueToPoint(startX), ValueToPoint(startY)); + currItem->setGradientEnd(ValueToPoint(endX), ValueToPoint(endY)); + currItem->update(); + Py_RETURN_NONE; +} + PyObject *scribus_setgradfill(PyObject* /* self */, PyObject* args) { char *Name = const_cast<char*>(""); @@ -552,6 +571,7 @@ << scribus_setfilltrans__doc__ << scribus_setgradfill__doc__ << scribus_setgradstop__doc__ + << scribus_setgradvectors__doc__ << scribus_setitemname__doc__ << scribus_setlineblend__doc__ << scribus_setlinecap__doc__ Index: scribus/plugins/scriptplugin/cmdsetprop.h =================================================================== --- scribus/plugins/scriptplugin/cmdsetprop.h (revision 26024) +++ scribus/plugins/scriptplugin/cmdsetprop.h (working copy) @@ -13,6 +13,17 @@ /** Setting Object Properties */ /*! docstring */ +PyDoc_STRVAR(scribus_setgradvectors__doc__, + QT_TR_NOOP("setGradientVectors(startX, startY, endX, endY, [\"name\"])\n\ +\n\ +Sets the gradient vectors of the object \"name\" to (startX, startY) -> (endX, endY).\n\ +The coordinates are given in the current measurement units of the document\n\ +(see UNIT constants).\n\ If \"name\" is not given the currently selected item is used.\n\ +")); +/*! Set gradient vector */ +PyObject* scribus_setgradvectors(PyObject* /*self*/, PyObject* args); + +/*! docstring */ PyDoc_STRVAR(scribus_setgradfill__doc__, QT_TR_NOOP("setGradientFill(type, \"color1\", shade1, \"color2\", shade2, [\"name\"])\n\ \n\ Index: scribus/plugins/scriptplugin/scriptplugin.cpp =================================================================== --- scribus/plugins/scriptplugin/scriptplugin.cpp (revision 26024) +++ scribus/plugins/scriptplugin/scriptplugin.cpp (working copy) @@ -364,6 +364,9 @@ {const_cast<char*>("getFontNames"), (PyCFunction)scribus_getfontnames, METH_NOARGS, tr(scribus_getfontnames__doc__)}, {const_cast<char*>("getFontSize"), scribus_getfontsize, METH_VARARGS, tr(scribus_getfontsize__doc__)}, {const_cast<char*>("getFrameText"), scribus_getframetext, METH_VARARGS, tr(scribus_getframetext__doc__)}, + {const_cast<char*>("getGradientStop"), scribus_getgradstop, METH_VARARGS, tr(scribus_getgradstop__doc__)}, + {const_cast<char*>("getGradientStopsCount"), scribus_getgradstopscount, METH_VARARGS, tr(scribus_getgradstopscount__doc__)}, + {const_cast<char*>("getGradientVectors"), scribus_getgradvectors, METH_VARARGS, tr(scribus_getgradvectors__doc__)}, {const_cast<char*>("getGroupItems"), (PyCFunction)scribus_getGroupItems, METH_VARARGS|METH_KEYWORDS, tr(scribus_getGroupItems__doc__)}, {const_cast<char*>("getGuiLanguage"), (PyCFunction)scribus_getlanguage, METH_NOARGS, tr(scribus_getlanguage__doc__)}, {const_cast<char*>("getHGuides"), (PyCFunction)scribus_getHguides, METH_NOARGS, tr(scribus_getHguides__doc__)}, @@ -533,6 +536,7 @@ {const_cast<char*>("setFontSize"), scribus_setfontsize, METH_VARARGS, tr(scribus_setfontsize__doc__)}, {const_cast<char*>("setGradientFill"), scribus_setgradfill, METH_VARARGS, tr(scribus_setgradfill__doc__)}, {const_cast<char*>("setGradientStop"), scribus_setgradstop, METH_VARARGS, tr(scribus_setgradstop__doc__)}, + {const_cast<char*>("setGradientVectors"), scribus_setgradvectors, METH_VARARGS, tr(scribus_setgradvectors__doc__)}, {const_cast<char*>("setHGuides"), scribus_setHguides, METH_VARARGS, tr(scribus_setHguides__doc__)}, {const_cast<char*>("setImageBrightness"), scribus_setimagebrightness, METH_VARARGS, tr(scribus_setimagebrightness__doc__)}, {const_cast<char*>("setImageGrayscale"), scribus_setimagegrayscale, METH_VARARGS, tr(scribus_setimagegrayscale__doc__)}, |
Date Modified | Username | Field | Change |
---|---|---|---|
2024-02-06 08:47 | Zinal | New Issue | |
2024-02-06 08:47 | Zinal | Tag Attached: feature request | |
2024-02-06 08:47 | Zinal | Tag Attached: gradients | |
2024-02-06 08:47 | Zinal | Tag Attached: python | |
2024-02-06 08:47 | Zinal | Tag Attached: scripter | |
2024-02-06 09:12 | Zinal | Note Added: 0050966 | |
2024-02-06 09:12 | Zinal | File Added: 17154-gradient_vectors.diff | |
2024-02-06 11:29 | ale | Note Added: 0050967 | |
2024-02-07 01:27 | Zinal | Note Added: 0050971 | |
2024-02-07 01:27 | Zinal | File Added: 17154-gradient_methods.diff |