Skip to content

Instantly share code, notes, and snippets.

@okay-type
Last active March 14, 2024 20:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save okay-type/c63ecd6437b541c3c01d464c39adff95 to your computer and use it in GitHub Desktop.
Save okay-type/c63ecd6437b541c3c01d464c39adff95 to your computer and use it in GitHub Desktop.
An InDesign script to randomly transform each selected object
// indesign script
// apply a random transformation to each selected objects
// 2024 jackson@okaytype.com
function rotate_objects(params) {
var rotate_range = parseFloat(params[0])
var x_range = params[1]
var y_range = params[2]
var scale_range_min = parseFloat(params[3])/100
var scale_range_max = parseFloat(params[4])/100
var objects = app.selection
for (var i = 0; i < app.selection.length; i++) {
var r_angle = (-rotate_range/2) + (Math.random() * rotate_range)
var x_translation = (-x_range/2) + (Math.random() * x_range)
var y_translation = (-y_range/2) + (Math.random() * y_range)
var s_factor = 1
if (scale_range_min != 1 || scale_range_max != 1){
var s_factor = scale_range_min + (Math.random() * (scale_range_max - scale_range_min))
}
objects[i].transform(
CoordinateSpaces.pasteboardCoordinates,
AnchorPoint.centerAnchor,
app.transformationMatrices.add({
counterclockwiseRotationAngle: r_angle,
horizontalTranslation: x_translation,
verticalTranslation: y_translation,
verticalScaleFactor: s_factor,
horizontalScaleFactor: s_factor,
}),
)
}
}
var myDialog = app.dialogs.add({name:'Randomly Transform Each', canCancel:true})
with(myDialog){
with (dialogColumns.add()){
with(borderPanels.add()){
staticTexts.add({
staticLabel:'Rotate Range',
minWidth: 100,
})
var rotate_range_field = angleEditboxes.add({
editContents:'0',
})
}
with(borderPanels.add()){
staticTexts.add({
staticLabel:'X Range',
minWidth: 100,
})
var x_range_field = measurementEditboxes.add({
editValue:0,
editUnits:MeasurementUnits.inches,
})
}
with(borderPanels.add()){
staticTexts.add({
staticLabel:'Y Range',
minWidth: 100,
})
var y_range_field = measurementEditboxes.add({
editValue:0,
editUnits:MeasurementUnits.inches,
})
}
with(borderPanels.add()){
staticTexts.add({
staticLabel:'Scale Min',
minWidth: 100,
})
var scale_field_min = percentEditboxes.add({
editContents:'100',
})
}
with(borderPanels.add()){
staticTexts.add({
staticLabel:'Scale Max',
minWidth: 100,
})
var scale_field_max = percentEditboxes.add({
editContents:'100',
})
}
}
}
var myResult = myDialog.show()
if (myResult == true) {
var rotate_range = rotate_range_field.editContents
var x_range = x_range_field.editValue
var y_range = y_range_field.editValue
var scale_field_min = scale_field_min.editContents
var scale_field_max = scale_field_max.editContents
myDialog.destroy()
var params = [rotate_range, x_range, y_range, scale_field_min, scale_field_max]
app.doScript(rotate_objects, ScriptLanguage.javascript, params, UndoModes.entireScript, 'Randomly Transform Each')
} else {
myDialog.destroy()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment