Copy link to clipboard
Copied
Hi guys,
I'm trying to get a vbscript to do this maybe easy task for some of you
I want to select 2 layers by name and then set the command :
NameA = "nomdeCalqueA"
NameB = "nomdeCalqueB"
Set appRef = CreateObject("Illustrator.Application")
Set idoc = appRef.ActiveDocument
appRef.activeDocument.Selection = Empty
For Each targetDocument In appRef.Documents
countOfLayers = targetDocument.Layers.Count
For layerIndex = countOfLayers To 1 Step -1
Set targetLayer = targetDocument.Layers(layerIndex)
layerName = targetLayer.Name
If (InStr(layerName, NameA) = 1) Then
'then select my layer
End If
If (InStr(layerName, NameB) = 1) Then
'then select my layer
End If
Next
Next
appRef.executeMenuCommand ("makeMask")
I'm a little lost...
Thank you for helping.
Nems.
Copy link to clipboard
Copied
the makeMask menu command makes a Clipping mask.
are you trying to create a clipping mask or a transparency mask?
Copy link to clipboard
Copied
Hi,
I'm trying to make a clipping mask, that's why 2 layers is need to be selected.
I didn't get how to make my two layers as active selections to excecute "makeMask"
Copy link to clipboard
Copied
I'm a Javascript kinda guy.
this will get you started...
selectAll('cut');
selectAll('art');
app.executeMenuCommand('makeMask');
function selectAll(layerName){
stuff = app.activeDocument.layers.getByName(layerName);
for(var i = 0; i < stuff.pageItems.length; i++){
stuff.pageItems.selected = true;
}
}
Copy link to clipboard
Copied
I am not aware that you can mask more than two elements, at least not to get the result that I suspect you desire. So what you will need to do, if you have more than one element on one or both layers, is to group the elements, select the two grouped elements, then mask them.
Copy link to clipboard
Copied
TT made me think.
if the cut layer has more then 1 item it wont give correct results.
make compound path first will help.
new script...
selectAll('cut');
$.sleep(500);
app.executeMenuCommand('compoundPath');
selectAll('art');
$.sleep(500);
app.executeMenuCommand('makeMask');
function selectAll(layerName){
var stuff = app.activeDocument.layers.getByName(layerName);
for(var i = 0; i < stuff.pageItems.length; i++){
stuff.pageItems.selected = true;
}
}
be aware this will move all items in the 2 layers to the cut layer
the sleep just helps reliability...
Copy link to clipboard
Copied
iDoc.Layers("Name") in VB.NET ... try it for VBS or possibly iDoc.Layers.Item("Name").
Again -- just remember you're masking elements, not layers.
Since you're more comfortable with VB maybe this could help, albeit it VB.NET. Translation should be pretty easy for you though. Note: I just pop in GUIDs to temporarily name the groups. You can use a different naming convention.
Dim aDoc As Document = app.ActiveDocument
aDoc.Selection = False
Dim grp1 = CreateGroup(aDoc, "Layer 4") 'whatever layer name you want
app.ExecuteMenuCommand("compoundPath")
Dim grp2 = CreateGroup(aDoc, "Layer 2") 'whatever layer name you want
app.ExecuteMenuCommand("makeMask")
Private Function CreateGroup(aDoc As Document, layerName As String)
Dim tmpGuid = Guid.NewGuid.ToString
Dim layer As Layer = aDoc.Layers(layerName)
Dim grp = layer.GroupItems.Add : grp.Name = tmpGuid
For i = layer.PageItems.Count To 1 Step -1
Dim pi = layer.PageItems(i)
If Not pi.Name = tmpGuid Then pi.Move(layer.PageItems(tmpGuid), AiElementPlacement.aiPlaceInside)
Next
layer.PageItems(tmpGuid).Selected = True
Return layer.PageItems(tmpGuid)
End Function
Copy link to clipboard
Copied
Hi Guys,
thank you for giving answers.
My script will be launched on a file with a layer including a path and a layer including a photo, all other layers are hidden.
Now I need to translate your javascript in vbscript because it is used in an HTA file.
does someone know what could be "layers.getByName(layerName)" in vbscript?
thank you again.
Nems.