Copy link to clipboard
Copied
Hi im not sure if this is possible but thought id ask as it would really speed up my workflow.
I draw very detailed cut files.
The pt size of a stroke cant go below 1.5pt or it won't cut correctly.
At the moment I draw the illustration the correct size to start but during the process of the design, i might resize a section to fit better in the overall picture which then sometimes means lines go below the cut size.
Is there any way to lock my point size so I can't resize it below 1.5pt?
thank you for your help
Hi @catrionarobyn, Do you know how to use scripts? Try this one. Just make a selection and then run the script.
- Mark
/**
* @file Set Minimum Stroke Width.js
*
* Usage: make a selection and run script.
*
* @author m1b
* @version 2025-07-16
* @discussion https://community.adobe.com/t5/illustrator-discussions/set-a-minimum-stroke-size/m-p/15416975
*/
(function () {
const MIN_STROKE_WIDTH = 1.5;
var doc = app.activeDocument;
var items = getItems({
from: doc.selection
...
Copy link to clipboard
Copied
Hi @catrionarobyn, Do you know how to use scripts? Try this one. Just make a selection and then run the script.
- Mark
/**
* @file Set Minimum Stroke Width.js
*
* Usage: make a selection and run script.
*
* @author m1b
* @version 2025-07-16
* @discussion https://community.adobe.com/t5/illustrator-discussions/set-a-minimum-stroke-size/m-p/15416975
*/
(function () {
const MIN_STROKE_WIDTH = 1.5;
var doc = app.activeDocument;
var items = getItems({
from: doc.selection,
getGroupItems: false,
filter: function (a) {
if (
a.stroked
&& a.strokeWidth < MIN_STROKE_WIDTH
)
a.strokeWidth = MIN_STROKE_WIDTH
},
});
})();
/** ------------------------------------------------------------------- *
* GET ITEMS *
* -------------------------------------------------------------------- *
* @author m1b *
* @version 2025-03-29 *
* -------------------------------------------------------------------- *
* Collects page items from a `from` source, eg. a Document, Layer, *
* GroupItem, or Array. Will look inside group items up to `maxDepth`. *
* Search can be filtered using `filter` function. Note that the *
* filter function is evaluated last in the filtering process. *
* -------------------------------------------------------------------- *
* Example 1. Get all items in document: *
* *
* var myItems = getItems({ from: app.activeDocument }); *
* *
* -------------------------------------------------------------------- *
* Example 2. Get all selected items except groups: *
* *
* var myItems = getItems({ *
* from: app.activeDocument.selection, *
* getGroupItems: false, *
* }); *
* *
* -------------------------------------------------------------------- *
* Example 3. Using `filter` function to choose item type: *
* *
* var myItems = getItems({ *
* from: app.activeDocument, *
* filter: function (item) { *
* return ( *
* 'PathItem' === item.typename *
* || 'CompoundPathItem' === item.typename *
* ); *
* } *
* }); *
* *
* -------------------------------------------------------------------- *
* Example 4. Using `filter` function: *
* *
* var myItems = getItems({ *
* from: app.activeDocument, *
* filter: onlyPngLinks *
* }); *
* *
* function onlyPngLinks(item, depth) { *
* return ( *
* 'PlacedItem' === item.typename *
* && '.png' === item.file.name.slice(-4).toLowerCase() *
* ); *
* }; *
* *
* -------------------------------------------------------------------- *
* Example 4. Using the `filter` function for custom collecting: *
* *
* This example bypasses the normal returned array and instead *
* captures items in an "external" array `itemsByDepth`. *
* *
* var itemsByDepth = []; *
* *
* function getItemsByDepth(item, depth) { *
* if (undefined == itemsByDepth[depth]) *
* itemsByDepth[depth] = []; *
* itemsByDepth[depth].push(item); *
* }; *
* *
* getItems({ *
* from: app.activeDocument, *
* filter: getItemsByDepth *
* }); *
* *
* -------------------------------------------------------------------- *
* @param {Object} options - parameters
* @param {PageItem|Array<PageItem>|Document|Layer} options.from - the thing(s) to look in, eg. a selection.
* @param {Function} [options.filter] - function that, given a found item, must return true (default: no filtering).
* @param {Boolean} [options.getPageItems] - whether to include page items in returned items (default: true).
* @param {Boolean} [options.getGroupItems] - whether to include GroupItems in returned items (default: true).
* @param {Boolean} [options.getLayers] - whether to include Layers in returned items (default: false).
* @param {Boolean} [options.getHiddenItems] - whether to include hidden items in returned items (default: true).
* @param {Boolean} [options.getLockedItems] - whether to include locked items in returned items (default: true).
* @param {Boolean} [options.getGuideItems] - whether to include guide items in returned items (default: false).
* @param {Number} [options.maxDepth] - deepest folder level (recursion depth limit) (default: 99).
* @param {Boolean} [options.returnFirstMatch] - whether to return only the first found item (default: false).
* @param {Number} [depth] - the current depth (private).
* @returns {Array|PageItem} - all the found items in a flat array, or the first found item if `returnFirstMatch`.
*/
function getItems(options, depth) {
// defaults
options = options || {};
var found = [],
depth = depth || 0,
items = options.from;
if (!options.initialized)
// once-off initialization
if (!initialize())
return [];
itemsLoop:
for (var i = 0, item, len = items.length; i < len; i++) {
item = items[i];
if (
false === excludeFilter(item)
&& true === includeFilter(item)
) {
// item found!
found.push(item);
if (options.returnFirstMatch)
break itemsLoop;
}
if (
'GroupItem' !== item.constructor.name
&& 'Layer' !== item.typename
)
// only items with children from here
continue itemsLoop;
if (
excludeHidden(item)
|| excludeLocked(item)
)
// don't look into excluded containers
continue itemsLoop;
if (depth >= options.maxDepth)
// don't go deeper
continue itemsLoop;
// set up for the next depth
options.from = item.pageItems;
// look inside
found = found.concat(Mittens.getItems(options, depth + 1));
}
// this level done
if (true == options.returnFirstMatch)
return found[0];
else
return found;
/**
* Returns true when the item should be not be found.
* @param {PageItem|Layer} item
* @returns {Boolean}
*/
function excludeFilter(item) {
return (
isAlreadyFound(item)
// is hidden
|| excludeHidden(item)
// is locked
|| excludeLocked(item)
// is guide
|| (
false === options.getGuideItems
&& true === item.guides
)
// is layer
|| (
false === options.getLayers
&& 'Layer' === item.typename
)
// is group item
|| (
false === options.getGroupItems
&& 'GroupItem' === item.typename
)
// is page item
|| (
false === options.getPageItems
&& 'GroupItem' !== item.typename
&& undefined != item.uuid
)
);
};
/**
* Returns true when the item should be included.
* @param {PageItem|Layer} item
* @returns {Boolean}
*/
function includeFilter(item) {
return (
undefined == options.filter
|| options.filter(item, depth)
);
};
/**
* Returns true when the item should
* be excluded because it is hidden.
* @param {PageItem|Layer} item
* @returns {Boolean}
*/
function excludeHidden(item) {
return (
false === options.getHiddenItems
&& (
true === item.hidden
|| false === item.visible
)
);
};
/**
* Returns true when the item should
* be excluded because it is locked.
* @param {PageItem|Layer} item
* @returns {Boolean}
*/
function excludeLocked(item) {
return (
false === options.getLockedItems
&& true === item.locked
);
};
/**
* Returns true if item was already
* found, and marks item as found,
* to avoid finding same item twice.
* @param {PageItem|Layer} item
* @returns {Boolean}
*/
function isAlreadyFound(item) {
var uuid = item.hasOwnProperty('uuid')
? item.uuid
: item.typename + item.zOrderPosition,
isFound = !!options.isFound[uuid];
options.isFound[uuid] = true;
return isFound;
}
/**
* Returns the initialised `options` object.
* @returns {Object}
*/
function initialize() {
if (
undefined == items
|| 0 == items.length
)
return false;
// make a new object, so we don't pollute the original
options = {
initialized: true,
depth: 0,
isFound: {},
filter: options.filter,
getPageItems: false !== options.getPageItems,
getGroupItems: false !== options.getGroupItems,
getLayers: true === options.getLayers,
getHiddenItems: false !== options.getHiddenItems,
getLockedItems: false !== options.getLockedItems,
getGuideItems: true === options.getGuideItems,
maxDepth: options.maxDepth,
returnFirstMatch: options.returnFirstMatch,
};
if (
undefined == options.maxDepth
|| !options.maxDepth instanceof Number
)
options.maxDepth = 99;
// items is a single layer
if ('Layer' === items.typename)
items = [items];
// items is a document
else if ('Document' === items.constructor.name) {
var layers = items.layers;
items = [];
for (var i = 0; i < layers.length; i++)
items.push(layers[i]);
}
else if ('Array' !== items.constructor.name)
items = [items];
return items.length > 0;
};
};
Copy link to clipboard
Copied
hi thank you! I yes I do know how to use them.
so what will this one do exactly?
Copy link to clipboard
Copied
Haha, so sorry I forgot to address your actual question. I don't know of any way to set a minimum stroke width. However this script might be the next best option: it will change any stroke width that is below 1.5pt to 1.5pt. Just select all, then run script.
Copy link to clipboard
Copied
thank you that's so helpful.
Copy link to clipboard
Copied
An additional idea: If it is appropriate that all your stroke weights can be set to exactly 1.5 pt or higher, you can just turn off the "Scale Strokes and Effects" option in the Transform panel (menu) to prevent the stroke weights from decreasing / increasing when you scale them with the Selection tool, Scale tool or Free Transform tool.
Copy link to clipboard
Copied
thank you for your reply. It still needs to scale just cant be less than 1.5. i think the script will be what im looking for though.
Copy link to clipboard
Copied
Just in case you didn't already know: A very fast way to select (and then modify) all unlocked and visible strokes whose weights are smaller than 1.5 pt is to draw a stroked path P1, set its weight to 0.0001 pt, open the Magic Wand panel (double click the Magic Wand tool in the Tools panel), turn on the Stroke Weight checkbox and set the Tolerance to 1.4998 pt.
Then take the Magic Wand tool and click on the very thin path P1. After that all paths with stroke weights smaller than 1.5 pt get immediately selected (unless you restrict the selection to the current layer (see Magic Wand panel flyout menu)).
Copy link to clipboard
Copied
Kurt, this is some serious kung-fu! Thanks for teaching me.
- Mark
Find more inspiration, events, and resources on the new Adobe Community
Explore Now