Copy link to clipboard
Copied
Hello.
I believe in the power of this forum, once a friend helped me write a script, for which I thank you again!
Is anyone able to write me a skeleton script that will insert/draw crosses like in the screen for each selected grouped element? Such a cross should be 7mm in size and be at least 7mm away from the object.
Both crosses should be in one line. Importantly, next to the right cross on the right side there should be the inserted text from the variable that I should enter, while at the bottom the variable counting +1 to each object (more or less like on the screen)
The crosshairs should be the same color as the selected objects (usually black or a secondary swatch).
Please help
// select targets
var input = prompt("");
var w = 7 * 2.835;
var gap = w;
var weight = 0.25 * 2.835;
var layer1 = app.activeDocument.layers.add();
layer1.name = "+";
var color = new CMYKColor();
color.black = 100;
var counter = 1;
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var group = layer1.groupItems.add();
var b = app.selection[i].geometricBounds;
var y = b[1] + ((b[3] - b[1]) / 2);
var x1 = b[0] - gap -
...
For all five crosses:
var w = 7 * 2.835;
var gap = w;
var doc = app.activeDocument;
var color = new CMYKColor();
color.black = 100;
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var b = app.selection[i].geometricBounds;
var y = b[1] + ((b[3] - b[1]) / 2);
var x1 = b[0] - gap - w / 2, x2 = b[2] + gap + w / 2;
var x = b[0] + ((b[2] - b[0]) / 2);
var y1 = b[1] + gap + w / 2, y2 = b[3] - gap - w / 2;
...
Copy link to clipboard
Copied
Regarding the text, (1) is the input variable (the top line) to be hardwired into the script, (2) is the number (the bottom line) just a count of the items, and (3) what size and font?
This should do the crosses (without the text). Also, group items don't have colors, so color is black.
// select targets
var w = 7 * 2.835;
var gap = w;
var doc = app.activeDocument;
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var bounds = app.selection[i].geometricBounds;
var y = bounds[1] + ((bounds[3] - bounds[1]) / 2);
var x1 = bounds[0] - gap - w / 2;
var x2 = bounds[2] + gap + w / 2;
function draw(top, left, w, p) {
var square = doc.pathItems.rectangle(
top, left, w, w);
var line1 = doc.pathItems.add();
line1.setEntirePath([[p - w, y], [p + w, y]]);
var line2 = doc.pathItems.add();
line2.setEntirePath([[p, y - w], [p, y + w]]);
square.strokeWidth = line1.strokeWidth = line2.strokeWidth = 1;
var color = new RGBColor();
color.red = color.green = color.blue = 0;
square.strokeColor = line1.strokeColor = line2.strokeColor = color;
square.filled = false;
}
draw(y + w / 4, x1 - w / 4, w / 2, x1);
draw(y + w / 4, x2 - w / 4, w / 2, x2);
}
}
Copy link to clipboard
Copied
Thank you again for your help!
you are great
1. yes, there should be one and the same number in the entire document, but each time the script is run, it wants to enter this number (because each project has a different number).
2. yes, it's supposed to be the number of objects. Each object should be numbered from 1
3. Myriad Pro. Regular, 12pt
What you wrote works, but only on one object (despite selecting several)
I forgot to add that the thickness of the crosses should be 0.25mm and that it would create a new layer called "+"
Copy link to clipboard
Copied
As for the color, if they can't be the same color as the group, it's like they can be 100% black in the CMYK palette
Copy link to clipboard
Copied
I've already converted to CMYK
var color = new CMYKColor();
color.black = 100;
And the code works on multiple objects though (I checked it wrong, sorry)
Copy link to clipboard
Copied
// select targets
var input = prompt("");
var w = 7 * 2.835;
var gap = w;
var weight = 0.25 * 2.835;
var layer1 = app.activeDocument.layers.add();
layer1.name = "+";
var color = new CMYKColor();
color.black = 100;
var counter = 1;
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var group = layer1.groupItems.add();
var b = app.selection[i].geometricBounds;
var y = b[1] + ((b[3] - b[1]) / 2);
var x1 = b[0] - gap - w / 2;
var x2 = b[2] + gap + w / 2;
function draw(top, left, w, p) {
var square = layer1.pathItems.rectangle(top, left, w, w);
var l1 = layer1.pathItems.add();
l1.setEntirePath([[p - w, y], [p + w, y]]);
var l2 = layer1.pathItems.add();
l2.setEntirePath([[p, y - w], [p, y + w]]);
l2.strokeWidth = l1.strokeWidth = square.strokeWidth = weight;
l2.strokeColor = l1.strokeColor = square.strokeColor = color;
square.filled = false;
square.moveToEnd(group);
l1.moveToEnd(group);
l2.moveToEnd(group);
}
draw(y + w / 4, x1 - w / 4, w / 2, x1);
draw(y + w / 4, x2 - w / 4, w / 2, x2);
function comp(p, content) {
var t = layer1.textFrames.pointText([x2 + w / 2, y + p]);
t.contents = content;
t.textRange.textFont = app.textFonts["MyriadPro-Regular"];
t.textRange.strokeWeight = weight;
t.textRange.fillColor = t.textRange.strokeColor = color;
t.moveToEnd(group);
}
comp(w / 4, input);
comp(- w * 3 /4, counter);
counter++;
}
}
Copy link to clipboard
Copied
It works!
Two help is invaluable!
One more question, it will be possible to add something to support the colors of the additional sample, i.e. if I enter the name of the additional sample in the variable, it will insert it all with this color sample?
Copy link to clipboard
Copied
Sorry, I don't understand the last question.
Copy link to clipboard
Copied
Sorry, my English is very basic
I have added custom colors, additional samples.
Is there a possibility that, for example, after entering the name of this additional color, the script will work in this selected color?
I forgot the most important
They must have the fill attribute and the outline of the overprint turned on.
Copy link to clipboard
Copied
If I understand correctly, you want to input the name of a swatch to use its color. If this is the case, change
var color = new CMYKColor();
color.black = 100;
to
var color = app.activeDocument.swatches[prompt("")].color;
Or, if the swatch is always going to be called "red", to
var color = app.activeDocument.swatches["red"].color;
Sorry, again, I don't understand the comment about the fill. There is no fill. Do you want a white fill?
Copy link to clipboard
Copied
I mean that the vertical and horizontal line have a white fill, basically it doesn't bother me so let's leave this topic.
It works with color change, but...
I'm trying to do if - if I enter "1" in the name of the color, it should draw in black, if I enter the name of the color, it should do with this color
var kolor = prompt("kolor");
if (kolor.text == "1")
{
var color = new CMYKColor();
color.black = 100;
}
else {
var color = app.activeDocument.swatches[prompt("")].color;
}
And what do I need to add to enable the attribute of filling the print with the outline of the print?
Copy link to clipboard
Copied
I noticed that when there are more colors in a group, the script can draw crosses without an outline, this is not always the case
Copy link to clipboard
Copied
I apologize in advance for so many posts. I'll try to include everything here.
So...
I extended the script with a pop-up window etc. Below it is attached.
The problem is that with groups with more elements, the crosses are drawn without any outline (I attached the screen in the above post)
I noticed that sometimes, despite the set thickness of 0.25mm, it will give an outline with a thickness of 1pt, or it will not make it at all.
I would also like them to have the overprint fill attribute and the overprint outline turned on
Copy link to clipboard
Copied
I can't replicate the problem with the stroke and weight. They should be unrelated to anything outside the script. To make sure the paths are stroked, you could add
square.stroked = l1.stroked = l2.stroked = true;
To add overprint
square.fillOverprint = square.strokeOverprint = true;
l1.fillOverprint = l1.strokeOverprint = true;
l2.fillOverprint = l2.strokeOverprint = true;
Copy link to clipboard
Copied
I have already dealt with the overprint and wrote exactly as you 🙂
As for the outline, adding what you wrote seems to have solved the problem. Thank you for help.
I added a bit more to the code, added the input from which number the elements should be counted, and if I want them in the color of the additional sample, I give the name (if not, they should be black) - I'm just wondering if it can be better solved
Would you be able to give me a skeleton code for drawing crosses to add them also centrally in the middle (vertical and horizontal), and at the top and bottom at 7mm distance from the object?
More specifically, it's about adding a cross
- a cross in the center of X and Y in line with those on the sides (as an if option, but I can handle it)
- two crosses in the X axis in the center of the object, and Y at the top at a distance of 7mm from the object, and at the bottom
Copy link to clipboard
Copied
For all five crosses:
var w = 7 * 2.835;
var gap = w;
var doc = app.activeDocument;
var color = new CMYKColor();
color.black = 100;
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var b = app.selection[i].geometricBounds;
var y = b[1] + ((b[3] - b[1]) / 2);
var x1 = b[0] - gap - w / 2, x2 = b[2] + gap + w / 2;
var x = b[0] + ((b[2] - b[0]) / 2);
var y1 = b[1] + gap + w / 2, y2 = b[3] - gap - w / 2;
function draw(top, left, w, p1, p2) {
var square = doc.pathItems.rectangle(top, left, w, w);
var line1 = doc.pathItems.add();
line1.setEntirePath([[p1 - w, p2], [p1 + w, p2]]);
var line2 = doc.pathItems.add();
line2.setEntirePath([[p1, p2 - w], [p1, p2 + w]]);
square.strokeWidth = line1.strokeWidth =
line2.strokeWidth = 1;
square.strokeColor = line1.strokeColor =
line2.strokeColor = color;
square.filled = false;
}
draw(y + w / 4, x1 - w / 4, w / 2, x1, y); // R
draw(y + w / 4, x2 - w / 4, w / 2, x2, y); // L
draw(y1 + w / 4, x - w / 4, w / 2, x, y1); // top
draw(y2 + w / 4, x - w / 4, w / 2, x, y2); // bottom
draw(y + w / 4, x - w / 4, w / 2, x, y); // centre
}
}
Copy link to clipboard
Copied
Thank you for your help.
I want to add what you wrote to the previous code I have, but something is changed and I can't figure out which variables are which.
Middle and left and right works, while top and bottom only draw a square
for (var i = 0; i < app.selection.length; i++) {
if (app.selection[i].typename == "GroupItem") {
var group = layer1.groupItems.add();
var b = app.selection[i].geometricBounds;
var y = b[1] + ((b[3] - b[1]) / 2);
var x1 = b[0] - gap - w / 2, x2 = b[2] + gap + w / 2;
var x = b[0] + ((b[2] - b[0]) / 2);
var y1 = b[1] + gap + w / 2, y2 = b[3] - gap - w / 2;
function draw(top, left, w, p, p1, p2) {
var square = layer1.pathItems.rectangle(top, left, w, w);
var l1 = layer1.pathItems.add();
l1.setEntirePath([[p - w, y], [p + w, y]]);
var l2 = layer1.pathItems.add();
l2.setEntirePath([[p, y - w], [p, y + w]]);
square.stroked = l1.stroked = l2.stroked = true;
l2.strokeWidth = l1.strokeWidth = square.strokeWidth = weight;
l2.strokeColor = l1.strokeColor = square.strokeColor = color;
l1.strokeOverprint = l2.strokeOverprint = square.strokeOverprint = l2.fillOverprint = l1.fillOverprint = true;
square.filled = l2.filled = l1.filled = false;
square.moveToEnd(group);
l1.moveToEnd(group);
l2.moveToEnd(group);
}
draw(y + w / 4, x1 - w / 4, w / 2, x1); // L
draw(y + w / 4, x2 - w / 4, w / 2, x2); // R
if (srodek.value == true){
draw(y + w / 4, x - w / 4, w / 2, x, y); // centre
draw(y1 + w / 4, x - w / 4, w / 2, x, y1); // top
draw(y2 + w / 4, x - w / 4, w / 2, x, y2); // bottom
}
//TEXT
function comp(p, content) {
var t = layer1.textFrames.pointText([x2 + w / 2, y + p]);
t.contents = content;
t.textRange.textFont = app.textFonts["MyriadPro-Regular"];
t.textRange.fillColor = color;
t.textRange.overprintFill = true;
t.moveToEnd(group);
}
comp(w / 4, input.text);
//number
if (ifnumber.value == false){
comp(- w * 3 /4, counter.text);
counter.text++;
}
}
}
Copy link to clipboard
Copied
The draw function changed. There's a an added variable to pass to it and a change in the body. This is the part that changed
function draw(top, left, w, p1, p2) {
var square = doc.pathItems.rectangle(top, left, w, w);
var line1 = doc.pathItems.add();
line1.setEntirePath([[p1 - w, p2], [p1 + w, p2]]);
var line2 = doc.pathItems.add();
line2.setEntirePath([[p1, p2 - w], [p1, p2 + w]]);
// ...
}
Copy link to clipboard
Copied
I renamed all the variables and it worked! Thank you
Now I'm wondering if it is possible (maybe if) for the script to check the size of elements, and if it is smaller than, for example, 400mm, it would not insert crosses at the top and bottom, and if it is larger, it would insert it.
I think it should be something like this
if (formula to check the height of objects){
draw(y1 + w / 4, x - w / 4, w / 2, x, y1); // top
draw(y2 + w / 4, x - w / 4, w / 2, x, y2); // bottom
}
I guess I'm asking too much :x
Copy link to clipboard
Copied
Not a problem.
if (app.selection[i].height > 400 * 2.835) {
draw(y1 + w / 4, x - w / 4, w / 2, x, y1); // top
draw(y2 + w / 4, x - w / 4, w / 2, x, y2); // bottom
}
Copy link to clipboard
Copied
Thank you for help. I don't think I can squeeze any more, we did everything I wanted 🙂
A little question from a slightly different topic.
And is it possible to set the color of the created new layer. I noticed that it often creates a yellow color, it is hardly visible and I have to manually change it to any other color.
I found some ready command, but it won't cooperate
What do I have to enter to make the checkbox checked by default after enabling the script? The "active onclick" function does not work and any other code combination below
name.onClick = function () {
restoreDefaultsButton.enabled = true;
name.active = false;
name.active = true;
}
Copy link to clipboard
Copied
To set a layer's "color", e.g. green:
var colorx = new RGBColor();
colorx.red = colorx.blue = 0;
colorx.green = 255;
var layerx = app.activeDocument.layers.add()
layerx.color = colorx;
To have a checkbox checked, assign it's "value" true.
var w = new Window("dialog");
var check1 = w.add("checkbox");
check1.value = true;
var button1 = w.add("button", undefined, "OK");
button1.onClick = function () {
if (check1.value) alert(true)
else alert(false);
}
w.show ();
Copy link to clipboard
Copied
Hi @femkeblanco !
I have another question.
Is it possible to display all the color swatches in the document in a script?
For example, after expanding the list, a window with all samples from the active open document/file will be displayed?
Such a list can be with names only if it is to be simpler
And one more thing. At the moment the code works so that each item must be in a group for it to insert crosses. Is it possible that if it also selects an element that is not in any group, it will also consider it?
EDIT:
I managed to write it with color -
I hooked it up to the script so that it doesn't give the color name, just choose from a list.
Below is the code that displays all color swatches and displays an alert when a specific color is selected
var swatchList = app.activeDocument.swatches;
var w = new Window("dialog", "Lista próbek");
var swatchListGroup = w.add("group");
swatchListGroup.orientation = "column";
var swatchDropdownList = swatchListGroup.add("dropdownlist");
for(var i = 0; i < swatchList.length; i++) {
swatchDropdownList.add("item", swatchList[i].name);
}
var selectButton = swatchListGroup.add("button", undefined, "GO!");
selectButton.onClick = function() {
var cusColor = swatchDropdownList.selection.text;
alert("Color: " + cusColor);
}
w.show();