|
const psapi = require('./psapi') |
|
const html_manip = require('./utility/html_manip') |
|
function finalWidthHeight( |
|
selectionWidth, |
|
selectionHeight, |
|
minWidth, |
|
minHeight |
|
) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
let finalWidth = 0 |
|
let finalHeight = 0 |
|
|
|
if (selectionWidth <= selectionHeight) { |
|
|
|
const scaleRatio = selectionWidth / minWidth |
|
|
|
finalWidth = minWidth |
|
finalHeight = selectionHeight / scaleRatio |
|
} else { |
|
const scaleRatio = selectionHeight / minHeight |
|
|
|
finalHeight = minHeight |
|
finalWidth = selectionWidth / scaleRatio |
|
} |
|
return [finalWidth, finalHeight] |
|
} |
|
|
|
async function selectionToFinalWidthHeight() { |
|
|
|
try { |
|
const selectionInfo = await psapi.getSelectionInfoExe() |
|
const [finalWidth, finalHeight] = finalWidthHeight( |
|
selectionInfo.width, |
|
selectionInfo.height, |
|
512, |
|
512 |
|
) |
|
|
|
return [ |
|
parseInt(finalWidth), |
|
parseInt(finalHeight), |
|
selectionInfo.width, |
|
selectionInfo.height, |
|
] |
|
} catch (e) { |
|
console.warn('you need a rectangular selection', e) |
|
} |
|
} |
|
|
|
async function selectBoundingBox() { |
|
let l = await app.activeDocument.activeLayers[0] |
|
let bounds = await l.boundsNoEffects |
|
let selectionInfo = convertSelectionObjectToSelectionInfo(bounds) |
|
await psapi.reSelectMarqueeExe(selectionInfo) |
|
return selectionInfo |
|
} |
|
function convertSelectionObjectToSelectionInfo(selection_obj) { |
|
let selection_info = { |
|
left: selection_obj._left, |
|
right: selection_obj._right, |
|
bottom: selection_obj._bottom, |
|
top: selection_obj._top, |
|
height: selection_obj._bottom - selection_obj._top, |
|
width: selection_obj._right - selection_obj._left, |
|
} |
|
return selection_info |
|
} |
|
|
|
const SelectionInfoDesc = () => ({ |
|
_obj: 'get', |
|
_target: [ |
|
{ |
|
_property: 'selection', |
|
}, |
|
{ |
|
_ref: 'document', |
|
_id: app.activeDocument._id, |
|
}, |
|
], |
|
_options: { |
|
dialogOptions: 'dontDisplay', |
|
}, |
|
}) |
|
class Selection { |
|
static async getSelectionInfoExe() { |
|
|
|
try { |
|
const selection = await executeAsModal(async () => { |
|
const result = await batchPlay([SelectionInfoDesc()], { |
|
synchronousExecution: true, |
|
modalBehavior: 'execute', |
|
}) |
|
|
|
return result[0]?.selection |
|
}) |
|
|
|
if (this.isSelectionValid(selection)) { |
|
let selection_info = { |
|
left: selection.left._value, |
|
right: selection.right._value, |
|
bottom: selection.bottom._value, |
|
top: selection.top._value, |
|
height: selection.bottom._value - selection.top._value, |
|
width: selection.right._value - selection.left._value, |
|
} |
|
|
|
return selection_info |
|
} |
|
} catch (e) { |
|
console.warn('selection info error', e) |
|
} |
|
} |
|
|
|
static isSelectionValid(selection) { |
|
console.warn( |
|
'isSelectionValid is deprecated use selection.isSelectionValid instead' |
|
) |
|
if ( |
|
selection && |
|
selection.hasOwnProperty('left') && |
|
selection.hasOwnProperty('right') && |
|
selection.hasOwnProperty('top') && |
|
selection.hasOwnProperty('bottom') |
|
) { |
|
return true |
|
} |
|
|
|
return false |
|
} |
|
static reselectArea(selection_info) {} |
|
static isSameSelection(selection_info_1, selection_info_2) {} |
|
static async getImageToSelectionDifference() { |
|
const selectionInfo = await psapi.getSelectionInfoExe() |
|
|
|
const width = html_manip.getWidth() |
|
const height = html_manip.getHeight() |
|
const scale_info_str = `${parseInt(width)}x${parseInt( |
|
height |
|
)} => ${parseInt(selectionInfo.width)}x${parseInt( |
|
selectionInfo.height |
|
)} ` |
|
let ratio = |
|
(width * height) / (selectionInfo.width * selectionInfo.height) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ratio |
|
} |
|
static {} |
|
} |
|
module.exports = { |
|
finalWidthHeight, |
|
selectionToFinalWidthHeight, |
|
selectBoundingBox, |
|
convertSelectionObjectToSelectionInfo, |
|
Selection, |
|
} |
|
|