-- ************************************************** -- Provide Moho with the name of this script object -- ************************************************** ScriptName = "MR_Overlay" -- ************************************************** -- General information about this script -- ************************************************** MR_Overlay = {} function MR_Overlay:Name() return self:Localize('UILabel') end function MR_Overlay:Version() return '1.3.1' end function MR_Overlay:UILabel() return self:Localize('UILabel') end function MR_Overlay:Creator() return 'Eugene Babich' end function MR_Overlay:Description() return self:Localize('Description') end -- ************************************************** -- Is Relevant / Is Enabled -- ************************************************** function MR_Overlay:IsRelevant(moho) return true end function MR_Overlay:IsEnabled(moho) return true end -- ************************************************** -- Recurring Values -- ************************************************** MR_Overlay.opacityValue = 50 MR_Overlay.strokeWidth = 6 MR_Overlay.selectNewOverlayLayer = false MR_Overlay.replaceOverlayLayer = true MR_Overlay.recolorStroke = false MR_Overlay.strokesOnly = false MR_Overlay.changeStrokeWidth = false MR_Overlay.strokeColorR = 225 MR_Overlay.strokeColorG = 30 MR_Overlay.strokeColorB = 30 MR_Overlay.strokeColorA = 255 MR_Overlay.layerSuffix = '_Overlay' MR_Overlay.doNotRender = true MR_Overlay.selectedPoints = false MR_Overlay.delete = false MR_Overlay.hideOverlay = false MR_Overlay.showOverlay = false MR_Overlay.deleteOverlay = false MR_Overlay.convertOverlay = false MR_Overlay.overlayLayer = nil MR_Overlay.flipOverlay = false MR_Overlay.selectionCenter = true MR_Overlay.layerOriginCenter = false MR_Overlay.customCenter = false MR_Overlay.pickCustomCenter = false MR_Overlay.customCenterValueX = 0 MR_Overlay.customCenterValueY = 0 MR_Overlay.createOverlayFromFrame = false MR_Overlay.frameVal1 = 1 MR_Overlay.frameVal2 = 200 MR_Overlay.frameVal3 = 400 MR_Overlay.useFrame1 = true MR_Overlay.useFrame2 = false MR_Overlay.useFrame3 = false MR_Overlay.layersToOverlay = {} MR_Overlay.secondarySelection = {} MR_Overlay.autoSelectPoints = false MR_Overlay.createOverlay = true MR_Overlay.onlyOverlaySelected = false MR_Overlay.mirrorFlip = false MR_Overlay.useShapeForPivot = false MR_Overlay.visibleLayersOnly = true MR_Overlay.preserveStrokeAlpha = true MR_Overlay.numVers = {} -- ************************************************** -- Prefs -- ************************************************** function MR_Overlay:LoadPrefs(prefs) self.opacityValue = prefs:GetInt("MR_Overlay.opacityValue", 50) self.strokeWidth = prefs:GetInt("MR_Overlay.strokeWidth", 6) self.doNotRender = prefs:GetBool("MR_Overlay.doNotRender", false) self.selectNewOverlayLayer = prefs:GetBool("MR_Overlay.selectNewOverlayLayer", false) self.replaceOverlayLayer = prefs:GetBool("MR_Overlay.replaceOverlayLayer", false) self.recolorStroke = prefs:GetBool("MR_Overlay.recolorStroke", false) self.strokesOnly = prefs:GetBool("MR_Overlay.strokesOnly", false) self.changeStrokeWidth = prefs:GetBool("MR_Overlay.changeStrokeWidth", false) self.strokeColorR = prefs:GetInt("MR_Overlay.strokeColorR", 225) self.strokeColorG = prefs:GetInt("MR_Overlay.strokeColorG", 30) self.strokeColorB = prefs:GetInt("MR_Overlay.strokeColorB", 30) self.strokeColorA = prefs:GetInt("MR_Overlay.strokeColorA", 255) self.hideOverlay = prefs:GetBool("MR_Overlay.hideOverlay", false) self.showOverlay = prefs:GetBool("MR_Overlay.showOverlay", false) self.deleteOverlay = prefs:GetBool("MR_Overlay.deleteOverlay", false) self.convertOverlay = prefs:GetBool("MR_Overlay.convertOverlay", false) self.flipOverlay = prefs:GetBool("MR_Overlay.flipOverlay", false) self.layerOriginCenter = prefs:GetBool("MR_Overlay.layerOriginCenter", true) self.selectionCenter = prefs:GetBool("MR_Overlay.selectionCenter", true) self.customCenter = prefs:GetBool("MR_Overlay.customCenter", false) self.pickCustomCenter = prefs:GetBool("MR_Overlay.pickCustomCenter", false) self.customCenterValueX = prefs:GetFloat("MR_Overlay.customCenterValueX", 0) self.customCenterValueY = prefs:GetFloat("MR_Overlay.customCenterValueY", 0) self.createOverlayFromFrame = prefs:GetBool("MR_Overlay.createOverlayFromFrame", false) self.frameVal1 = prefs:GetInt("MR_Overlay.frameVal1", 1) self.frameVal2 = prefs:GetInt("MR_Overlay.frameVal2", 200) self.frameVal3 = prefs:GetInt("MR_Overlay.frameVal3", 400) self.useFrame1 = prefs:GetBool("MR_Overlay.useFrame1", true) self.useFrame2 = prefs:GetBool("MR_Overlay.useFrame2", false) self.useFrame3 = prefs:GetBool("MR_Overlay.useFrame3", false) self.autoSelectPoints = prefs:GetBool("MR_Overlay.autoSelectPoints", false) self.createOverlay = prefs:GetBool("MR_Overlay.createOverlay", true) self.mirrorFlip = prefs:GetBool("MR_Overlay.mirrorFlip", false) self.useShapeForPivot = prefs:GetBool("MR_Overlay.useShapeForPivot", false) self.visibleLayersOnly = prefs:GetBool("MR_Overlay.visibleLayersOnly", true) self.preserveStrokeAlpha = prefs:GetBool("MR_Overlay.preserveStrokeAlpha", true) end function MR_Overlay:SavePrefs(prefs) prefs:SetInt("MR_Overlay.opacityValue", self.opacityValue) prefs:SetInt("MR_Overlay.strokeWidth", self.strokeWidth) prefs:SetBool("MR_Overlay.doNotRender", self.doNotRender) prefs:SetBool("MR_Overlay.selectNewOverlayLayer", self.selectNewOverlayLayer) prefs:SetBool("MR_Overlay.replaceOverlayLayer", self.replaceOverlayLayer) prefs:SetBool("MR_Overlay.recolorStroke", self.recolorStroke) prefs:SetBool("MR_Overlay.strokesOnly", self.strokesOnly) prefs:SetBool("MR_Overlay.changeStrokeWidth", self.changeStrokeWidth) prefs:SetInt("MR_Overlay.strokeColorR", self.strokeColorR) prefs:SetInt("MR_Overlay.strokeColorG", self.strokeColorG) prefs:SetInt("MR_Overlay.strokeColorB", self.strokeColorB) prefs:SetInt("MR_Overlay.strokeColorA", self.strokeColorA) prefs:SetBool("MR_Overlay.hideOverlay", self.hideOverlay) prefs:SetBool("MR_Overlay.showOverlay", self.showOverlay) prefs:SetBool("MR_Overlay.deleteOverlay", self.deleteOverlay) prefs:SetBool("MR_Overlay.convertOverlay", self.convertOverlay) prefs:SetBool("MR_Overlay.flipOverlay", self.flipOverlay) prefs:SetBool("MR_Overlay.layerOriginCenter", self.layerOriginCenter) prefs:SetBool("MR_Overlay.customCenter", self.customCenter) prefs:SetBool("MR_Overlay.pickCustomCenter", self.pickCustomCenter) prefs:SetFloat("MR_Overlay.customCenterValueX", self.customCenterValueX) prefs:SetFloat("MR_Overlay.customCenterValueY", self.customCenterValueY) prefs:SetBool("MR_Overlay.createOverlayFromFrame", self.createOverlayFromFrame) prefs:SetInt("MR_Overlay.frameVal1", self.frameVal1) prefs:SetInt("MR_Overlay.frameVal2", self.frameVal2) prefs:SetInt("MR_Overlay.frameVal3", self.frameVal3) prefs:SetBool("MR_Overlay.useFrame1", self.useFrame1) prefs:SetBool("MR_Overlay.useFrame2", self.useFrame2) prefs:SetBool("MR_Overlay.useFrame3", self.useFrame3) prefs:SetBool("MR_Overlay.autoSelectPoints", self.autoSelectPoints) prefs:SetBool("MR_Overlay.createOverlay", self.createOverlay) prefs:SetBool("MR_Overlay.mirrorFlip", self.mirrorFlip) prefs:SetBool("MR_Overlay.useShapeForPivot", self.useShapeForPivot) prefs:SetBool("MR_Overlay.visibleLayersOnly", self.visibleLayersOnly) prefs:SetBool("MR_Overlay.preserveStrokeAlpha", self.preserveStrokeAlpha) end function MR_Overlay:ResetPrefs() self.opacityValue = 50 self.strokeWidth = 6 self.doNotRender = true self.selectNewOverlayLayer = false self.replaceOverlayLayer = true self.recolorStroke = false self.strokesOnly = false self.changeStrokeWidth = false self.strokeColorR = 225 self.strokeColorG = 30 self.strokeColorB = 30 self.strokeColorA = 255 self.hideOverlay = false self.showOverlay = false self.deleteOverlay = false self.convertOverlay = false self.flipOverlay = false self.selectionCenter = true self.layerOriginCenter = false self.customCenter = false self.pickCustomCenter = false self.customCenterValueX = 0 self.customCenterValueY = 0 self.createOverlayFromFrame = false self.frameVal1 = 1 self.frameVal2 = 200 self.frameVal3 = 400 self.useFrame1 = true self.useFrame2 = false self.useFrame3 = false self.autoSelectPoints = false self.createOverlay = true self.mirrorFlip = false self.useShapeForPivot = false self.visibleLayersOnly = true self.preserveStrokeAlpha = true end -- ************************************************** -- MR_OverlayDialog -- ************************************************** local MR_OverlayDialog = {} MR_OverlayDialog.UPDATE_DIALOG = MOHO.MSG_BASE MR_OverlayDialog.UPDATE_DIALOG2 = MOHO.MSG_BASE + 1 MR_OverlayDialog.FRAME1 = MOHO.MSG_BASE + 2 MR_OverlayDialog.FRAME2 = MOHO.MSG_BASE + 3 MR_OverlayDialog.FRAME3 = MOHO.MSG_BASE + 4 function MR_OverlayDialog:new(moho) local fileWord = MOHO.Localize("/Menus/File/File=File") local d = LM.GUI.SimpleDialog(MR_Overlay:Localize('UILabel'), MR_OverlayDialog) local l = d:GetLayout() l:PushH() l:PushV() d.createOverlayRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Create Overlay'), d.UPDATE_DIALOG2) l:AddChild(d.createOverlayRadioButton, LM.GUI.ALIGN_LEFT, 0) d.createOverlayRadioButton:SetToolTip(MR_Overlay:Localize('Create Overlay Tooltip')) d.GetCustomCenterRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Get Custom Center'), d.UPDATE_DIALOG2) l:AddChild(d.GetCustomCenterRadioButton, LM.GUI.ALIGN_LEFT, 0) d.GetCustomCenterRadioButton:SetToolTip(MR_Overlay:Localize('Get Custom Center Tooltip')) d.hideOverlayRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Hide Overlay'), d.UPDATE_DIALOG2) l:AddChild(d.hideOverlayRadioButton, LM.GUI.ALIGN_LEFT, 0) d.hideOverlayRadioButton:SetToolTip(MR_Overlay:Localize('Hide Overlay Tooltip')) d.showOverlayRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Show Overlay'), d.UPDATE_DIALOG2) l:AddChild(d.showOverlayRadioButton, LM.GUI.ALIGN_LEFT, 0) d.showOverlayRadioButton:SetToolTip(MR_Overlay:Localize('Show Overlay Tooltip')) d.convertOverlayRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Convert Overlay'), d.UPDATE_DIALOG2) l:AddChild(d.convertOverlayRadioButton, LM.GUI.ALIGN_LEFT, 0) d.convertOverlayRadioButton:SetToolTip(MR_Overlay:Localize('Convert Overlay Tooltip')) d.deleteOverlayRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Delete Overlay'), d.UPDATE_DIALOG2) l:AddChild(d.deleteOverlayRadioButton, LM.GUI.ALIGN_LEFT, 0) d.deleteOverlayRadioButton:SetToolTip(MR_Overlay:Localize('Delete Overlay Tooltip')) l:Pop() if fileWord == "Файл" then l:AddPadding(12) else l:AddPadding(58) end l:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) l:PushV() d.replaceOverlayLayerCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Update Overlay Layer'), d.UPDATE_DIALOG) l:AddChild(d.replaceOverlayLayerCheckbox, LM.GUI.ALIGN_LEFT, 0) d.replaceOverlayLayerCheckbox:SetToolTip(MR_Overlay:Localize('Update top overlay Tooltip')) d.visibleLayersOnlyCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Visible Layers Only'), d.UPDATE_DIALOG) l:AddChild(d.visibleLayersOnlyCheckbox, LM.GUI.ALIGN_LEFT, 0) d.visibleLayersOnlyCheckbox:SetToolTip(MR_Overlay:Localize('Visible Layers Only Tooltip')) d.autoSelectPointsCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Auto Update Points'), d.UPDATE_DIALOG2) l:AddChild(d.autoSelectPointsCheckbox, LM.GUI.ALIGN_LEFT, 0) d.autoSelectPointsCheckbox:SetToolTip(MR_Overlay:Localize('Auto Update Points Tooltip')) d.selectNewOverlayLayerCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Select New Overlay Layer'), d.UPDATE_DIALOG) l:AddChild(d.selectNewOverlayLayerCheckbox, LM.GUI.ALIGN_LEFT, 0) d.selectNewOverlayLayerCheckbox:SetToolTip(MR_Overlay:Localize('Select new overlay Tooltip')) d.doNotRenderCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Do Not Render'), d.UPDATE_DIALOG) l:AddChild(d.doNotRenderCheckbox, LM.GUI.ALIGN_LEFT, 0) d.doNotRenderCheckbox:SetToolTip(MR_Overlay:Localize('Do Not Render Tooltip')) d.useShapeForPivotCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Use Shapes Center'), d.UPDATE_DIALOG2) l:AddChild(d.useShapeForPivotCheckbox, LM.GUI.ALIGN_LEFT, 0) d.useShapeForPivotCheckbox:SetToolTip(MR_Overlay:Localize('Use Shapes Center Tooltip')) l:Pop() l:Pop() l:AddChild(LM.GUI.Divider(false), LM.GUI.ALIGN_FILL) l:PushH() l:PushV() l:PushH() l:AddPadding(10) d.overlayLayerOpacityText = LM.GUI.DynamicText(MR_Overlay:Localize('opacity'), 0) l:AddChild(d.overlayLayerOpacityText, LM.GUI.ALIGN_LEFT, 3) d.overlayLayerOpacityText:SetToolTip(MR_Overlay:Localize('Opacity Tooltip')) if fileWord == "Файл" then l:AddPadding(7) else l:AddPadding(-18) end d.opacityValueInput = LM.GUI.TextControl(0, '100', d.UPDATE_DIALOG, LM.GUI.FIELD_INT, MR_Overlay:Localize(' ')) l:AddChild(d.opacityValueInput, LM.GUI.ALIGN_RIGHT, 0) d.opacityValueInput:SetToolTip(MR_Overlay:Localize('Opacity Tooltip')) l:Pop() l:PushH() d.changeStrokeWidthCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Change Stroke Width'), d.UPDATE_DIALOG) l:AddChild(d.changeStrokeWidthCheckbox, LM.GUI.ALIGN_LEFT, 0) d.changeStrokeWidthCheckbox:SetToolTip(MR_Overlay:Localize('Change Stroke Width Toolip')) d.strokeWidthValueInput = LM.GUI.TextControl(12, '100', d.UPDATE_DIALOG, LM.GUI.FIELD_FLOAT) l:AddChild(d.strokeWidthValueInput, LM.GUI.ALIGN_LEFT, 0) d.strokeWidthValueInput:SetToolTip(MR_Overlay:Localize('Change Stroke Width Toolip')) l:Pop() l:PushH() d.recolorStrokeCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Recolor Stroke'), d.UPDATE_DIALOG) l:AddChild(d.recolorStrokeCheckbox, LM.GUI.ALIGN_LEFT, 0) d.recolorStrokeCheckbox:SetToolTip(MR_Overlay:Localize('Recolor Stroke Tooltip')) d.strokeColorSwatch = LM.GUI.ShortColorSwatch(true, d.UPDATE_DIALOG) l:AddChild(d.strokeColorSwatch, LM.GUI.ALIGN_LEFT) d.strokeColorSwatch:SetToolTip(MR_Overlay:Localize('Recolor Stroke Tooltip')) l:Pop() d.preserveStrokeAlphaCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Preserve Strokes Alpha'), d.UPDATE_DIALOG) l:AddChild(d.preserveStrokeAlphaCheckbox, LM.GUI.ALIGN_LEFT, 0) d.preserveStrokeAlphaCheckbox:SetToolTip(MR_Overlay:Localize('Preserve Strokes Alpha Tooltip')) d.strokesOnlyCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Strokes Only'), d.UPDATE_DIALOG) l:AddChild(d.strokesOnlyCheckbox, LM.GUI.ALIGN_LEFT, 0) d.strokesOnlyCheckbox:SetToolTip(MR_Overlay:Localize('Strokes Only Tooltip')) l:Pop() l:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) l:PushV() d.flipCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Flip'), d.UPDATE_DIALOG) l:AddChild(d.flipCheckbox, LM.GUI.ALIGN_LEFT, 0) d.flipCheckbox:SetToolTip(MR_Overlay:Localize('Flip Tooltip')) d.mirrorFlipCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Mirror Flip'), d.UPDATE_DIALOG) l:AddChild(d.mirrorFlipCheckbox, LM.GUI.ALIGN_LEFT, 0) d.mirrorFlipCheckbox:SetToolTip(MR_Overlay:Localize('Mirror Flip Tooltip')) d.selectionCenterRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Selection Center'), d.UPDATE_DIALOG) l:AddChild(d.selectionCenterRadioButton, LM.GUI.ALIGN_LEFT, 0) d.selectionCenterRadioButton:SetToolTip(MR_Overlay:Localize('Selection Center Tooltip')) d.layerOriginCenterRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Layer Origin'), d.UPDATE_DIALOG) l:AddChild(d.layerOriginCenterRadioButton, LM.GUI.ALIGN_LEFT, 0) d.layerOriginCenterRadioButton:SetToolTip(MR_Overlay:Localize('Layer Origin Tooltip')) d.customflipCenterRadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Custom Center'), d.UPDATE_DIALOG) l:AddChild(d.customflipCenterRadioButton, LM.GUI.ALIGN_LEFT, 0) d.customflipCenterRadioButton:SetToolTip(MR_Overlay:Localize('Custom Center Tooltip')) l:Pop() l:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) l:PushV() d.createOverlayFromFrameCheckbox = LM.GUI.CheckBox(MR_Overlay:Localize('Create Overlay From Frame:'), d.UPDATE_DIALOG) l:AddChild(d.createOverlayFromFrameCheckbox, LM.GUI.ALIGN_LEFT, 0) d.createOverlayFromFrameCheckbox:SetToolTip(MR_Overlay:Localize('Create Overlay From Frame Tooltip')) l:PushH() d.frame1RadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Frame'), d.FRAME1) l:AddChild(d.frame1RadioButton, LM.GUI.ALIGN_LEFT, 0) d.frameText1Input = LM.GUI.TextControl(50, '100', d.UPDATE_DIALOG, LM.GUI.FIELD_INT, MR_Overlay:Localize(' ')) l:AddChild(d.frameText1Input, LM.GUI.ALIGN_LEFT, 0) l:Pop() l:PushH() d.frame2RadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Frame'), d.FRAME2) l:AddChild(d.frame2RadioButton, LM.GUI.ALIGN_LEFT, 0) d.frameText2Input = LM.GUI.TextControl(50, '200', d.UPDATE_DIALOG, LM.GUI.FIELD_INT, MR_Overlay:Localize(' ')) l:AddChild(d.frameText2Input, LM.GUI.ALIGN_LEFT, 0) l:Pop() l:PushH() d.frame3RadioButton = LM.GUI.RadioButton(MR_Overlay:Localize('Frame'), d.FRAME3) l:AddChild(d.frame3RadioButton, LM.GUI.ALIGN_LEFT, 0) d.frameText3Input = LM.GUI.TextControl(50, '400', d.UPDATE_DIALOG, LM.GUI.FIELD_INT, MR_Overlay:Localize(' ')) l:AddChild(d.frameText3Input, LM.GUI.ALIGN_LEFT, 0) l:Pop() l:Pop() l:Pop() l:AddChild(LM.GUI.Divider(false), LM.GUI.ALIGN_FILL) return d end function MR_OverlayDialog:UpdateWidgets(moho) self.opacityValueInput:SetValue(MR_Overlay.opacityValue) self.strokeWidthValueInput:SetValue(MR_Overlay.strokeWidth) self.doNotRenderCheckbox:SetValue(MR_Overlay.doNotRender) self.selectNewOverlayLayerCheckbox:SetValue(MR_Overlay.selectNewOverlayLayer) self.replaceOverlayLayerCheckbox:SetValue(MR_Overlay.replaceOverlayLayer) self.visibleLayersOnlyCheckbox:SetValue(MR_Overlay.visibleLayersOnly) self.recolorStrokeCheckbox:SetValue(MR_Overlay.recolorStroke) self.preserveStrokeAlphaCheckbox:SetValue(MR_Overlay.preserveStrokeAlpha) self.preserveStrokeAlphaCheckbox:Enable(MR_Overlay.recolorStroke) self.strokesOnlyCheckbox:SetValue(MR_Overlay.strokesOnly) self.changeStrokeWidthCheckbox:SetValue(MR_Overlay.changeStrokeWidth) self.strokeWidthValueInput:Enable(self.changeStrokeWidthCheckbox:Value()) self.strokeColorSwatch:Enable(self.recolorStrokeCheckbox:Value()) local strokeColor = LM.rgb_color:new_local() strokeColor.r = MR_Overlay.strokeColorR strokeColor.g = MR_Overlay.strokeColorG strokeColor.b = MR_Overlay.strokeColorB strokeColor.a = MR_Overlay.strokeColorA self.strokeColorSwatch:SetValue(strokeColor) self.flipCheckbox:SetValue(MR_Overlay.flipOverlay) self.mirrorFlipCheckbox:SetValue(MR_Overlay.mirrorFlip) self.mirrorFlipCheckbox:Enable(MR_Overlay.flipOverlay) self.selectionCenterRadioButton:SetValue(MR_Overlay.selectionCenter) self.layerOriginCenterRadioButton:SetValue(MR_Overlay.layerOriginCenter) self.customflipCenterRadioButton:SetValue(MR_Overlay.customCenter) self.selectionCenterRadioButton:Enable(MR_Overlay.flipOverlay) self.layerOriginCenterRadioButton:Enable(MR_Overlay.flipOverlay) self.customflipCenterRadioButton:Enable(MR_Overlay.flipOverlay) self.createOverlayFromFrameCheckbox:SetValue(MR_Overlay.createOverlayFromFrame) self.useShapeForPivotCheckbox:SetValue(MR_Overlay.useShapeForPivot) if MR_Overlay.onlyOverlaySelected then self.createOverlayRadioButton:Enable(false) else self.createOverlayRadioButton:Enable(true) end self.frame1RadioButton:SetValue(MR_Overlay.useFrame1) self.frame2RadioButton:SetValue(MR_Overlay.useFrame2) self.frame3RadioButton:SetValue(MR_Overlay.useFrame3) if MR_Overlay.createOverlayFromFrame then self.frame1RadioButton:Enable(true) self.frame2RadioButton:Enable(true) self.frame3RadioButton:Enable(true) self.frameText1Input:Enable(true) self.frameText2Input:Enable(true) self.frameText3Input:Enable(true) else self.frame1RadioButton:Enable(false) self.frame2RadioButton:Enable(false) self.frame3RadioButton:Enable(false) self.frameText1Input:Enable(false) self.frameText2Input:Enable(false) self.frameText3Input:Enable(false) end self.frameText1Input:SetValue(MR_Overlay.frameVal1) self.frameText2Input:SetValue(MR_Overlay.frameVal2) self.frameText3Input:SetValue(MR_Overlay.frameVal3) self.autoSelectPointsCheckbox:SetValue(MR_Overlay.autoSelectPoints) self.createOverlayRadioButton:SetValue(MR_Overlay.createOverlay) self.hideOverlayRadioButton:SetValue(MR_Overlay.hideOverlay) self.showOverlayRadioButton:SetValue(MR_Overlay.showOverlay) self.deleteOverlayRadioButton:SetValue(MR_Overlay.deleteOverlay) self.convertOverlayRadioButton:SetValue(MR_Overlay.convertOverlay) self.GetCustomCenterRadioButton:SetValue(MR_Overlay.pickCustomCenter) if MR_Overlay.hideOverlay and not MR_Overlay.overlayLayer then MR_Overlay.hideOverlay = false self.hideOverlayRadioButton:SetValue(false) self.createOverlayRadioButton:SetValue(true) MR_Overlay.createOverlay = true elseif MR_Overlay.showOverlay and not MR_Overlay.overlayLayer then MR_Overlay.showOverlay = false self.showOverlayRadioButton:SetValue(false) self.createOverlayRadioButton:SetValue(true) MR_Overlay.createOverlay = true elseif MR_Overlay.deleteOverlay and not MR_Overlay.overlayLayer then MR_Overlay.deleteOverlay = false self.deleteOverlayRadioButton:SetValue(false) self.createOverlayRadioButton:SetValue(true) MR_Overlay.createOverlay = true elseif MR_Overlay.convertOverlay and not MR_Overlay.overlayLayer then MR_Overlay.convertOverlay = false self.convertOverlayRadioButton:SetValue(false) self.createOverlayRadioButton:SetValue(true) MR_Overlay.createOverlay = true end self.useShapeForPivotCheckbox:Enable(MR_Overlay.autoSelectPoints) self.autoSelectPointsCheckbox:Enable(true) if not MR_Overlay.createOverlay then self.opacityValueInput:Enable(false) self.strokeWidthValueInput:Enable(false) self.doNotRenderCheckbox:Enable(false) self.selectNewOverlayLayerCheckbox:Enable(false) self.replaceOverlayLayerCheckbox:Enable(false) self.visibleLayersOnlyCheckbox:Enable(false) self.recolorStrokeCheckbox:Enable(false) self.strokesOnlyCheckbox:Enable(false) self.changeStrokeWidthCheckbox:Enable(false) self.flipCheckbox:Enable(false) self.selectionCenterRadioButton:Enable(false) self.layerOriginCenterRadioButton:Enable(false) self.customflipCenterRadioButton:Enable(false) self.createOverlayFromFrameCheckbox:Enable(false) self.frame1RadioButton:Enable(false) self.frame2RadioButton:Enable(false) self.frame3RadioButton:Enable(false) self.frameText1Input:Enable(false) self.frameText2Input:Enable(false) self.frameText3Input:Enable(false) self.strokeColorSwatch:Enable(false) self.overlayLayerOpacityText:Enable(false) self.mirrorFlipCheckbox:Enable(false) self.autoSelectPointsCheckbox:Enable(false) end local isOverlayLayer = false if MR_Overlay.overlayLayer then isOverlayLayer = true end self.hideOverlayRadioButton:Enable(isOverlayLayer) self.showOverlayRadioButton:Enable(isOverlayLayer) self.deleteOverlayRadioButton:Enable(isOverlayLayer) self.convertOverlayRadioButton:Enable(isOverlayLayer) if self.GetCustomCenterRadioButton:Value() then self.useShapeForPivotCheckbox:Enable(self.autoSelectPointsCheckbox:Value()) else self.useShapeForPivotCheckbox:Enable(false) end end function MR_OverlayDialog:OnOK(moho) MR_Overlay.opacityValue = LM.Clamp(self.opacityValueInput:IntValue(), 0, 100) MR_Overlay.strokeWidth = LM.Clamp(self.strokeWidthValueInput:FloatValue(), 0.25, 256) MR_Overlay.doNotRender = self.doNotRenderCheckbox:Value() MR_Overlay.selectNewOverlayLayer = self.selectNewOverlayLayerCheckbox:Value() MR_Overlay.replaceOverlayLayer = self.replaceOverlayLayerCheckbox:Value() MR_Overlay.visibleLayersOnly = self.visibleLayersOnlyCheckbox:Value() MR_Overlay.recolorStroke = self.recolorStrokeCheckbox:Value() MR_Overlay.preserveStrokeAlpha = self.preserveStrokeAlphaCheckbox:Value() MR_Overlay.strokesOnly = self.strokesOnlyCheckbox:Value() MR_Overlay.changeStrokeWidth = self.changeStrokeWidthCheckbox:Value() local colorSwatchValue = self.strokeColorSwatch:Value() MR_Overlay.strokeColorR = colorSwatchValue.r MR_Overlay.strokeColorG = colorSwatchValue.g MR_Overlay.strokeColorB = colorSwatchValue.b MR_Overlay.strokeColorA = colorSwatchValue.a MR_Overlay.flipOverlay = self.flipCheckbox:Value() MR_Overlay.mirrorFlip = self.mirrorFlipCheckbox:Value() MR_Overlay.selectionCenter = self.selectionCenterRadioButton:Value() MR_Overlay.layerOriginCenter = self.layerOriginCenterRadioButton:Value() MR_Overlay.customCenter = self.customflipCenterRadioButton:Value() MR_Overlay.createOverlayFromFrame = self.createOverlayFromFrameCheckbox:Value() MR_Overlay.useFrame1 = self.frame1RadioButton:Value() MR_Overlay.useFrame2 = self.frame2RadioButton:Value() MR_Overlay.useFrame3 = self.frame3RadioButton:Value() MR_Overlay.frameVal1 = LM.Clamp(self.frameText1Input:Value(), 0, 10000) MR_Overlay.frameVal2 = LM.Clamp(self.frameText2Input:Value(), 0, 10000) MR_Overlay.frameVal3 = LM.Clamp(self.frameText3Input:Value(), 0, 10000) MR_Overlay.autoSelectPoints = self.autoSelectPointsCheckbox:Value() MR_Overlay.createOverlay = self.createOverlayRadioButton:Value() MR_Overlay.hideOverlay = self.hideOverlayRadioButton:Value() MR_Overlay.showOverlay = self.showOverlayRadioButton:Value() MR_Overlay.deleteOverlay = self.deleteOverlayRadioButton:Value() MR_Overlay.convertOverlay = self.convertOverlayRadioButton:Value() MR_Overlay.pickCustomCenter = self.GetCustomCenterRadioButton:Value() MR_Overlay.useShapeForPivot = self.useShapeForPivotCheckbox:Value() end function MR_OverlayDialog:HandleMessage(msg) if msg == self.UPDATE_DIALOG then self.opacityValueInput:SetValue(LM.Clamp(self.opacityValueInput:IntValue(), 0, 100)) self.strokeWidthValueInput:SetValue(LM.Clamp(self.strokeWidthValueInput:FloatValue(), 0.25, 256)) self.strokeWidthValueInput:Enable(self.changeStrokeWidthCheckbox:Value()) self.strokeColorSwatch:Enable(self.recolorStrokeCheckbox:Value()) self.preserveStrokeAlphaCheckbox:Enable(self.recolorStrokeCheckbox:Value()) self.selectionCenterRadioButton:Enable(self.flipCheckbox:Value()) self.layerOriginCenterRadioButton:Enable(self.flipCheckbox:Value()) self.customflipCenterRadioButton:Enable(self.flipCheckbox:Value()) self.frame1RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frame2RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frame3RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText1Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText2Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText3Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText1Input:SetValue(LM.Clamp(self.frameText1Input:IntValue(), 0, 10000)) self.frameText2Input:SetValue(LM.Clamp(self.frameText2Input:IntValue(), 0, 10000)) self.frameText3Input:SetValue(LM.Clamp(self.frameText3Input:IntValue(), 0, 10000)) self.mirrorFlipCheckbox:Enable(self.flipCheckbox:Value()) self.useShapeForPivotCheckbox:Enable(self.autoSelectPointsCheckbox:Value()) if self.GetCustomCenterRadioButton:Value() then self.useShapeForPivotCheckbox:Enable(self.autoSelectPointsCheckbox:Value()) else self.useShapeForPivotCheckbox:Enable(false) end elseif msg == self.UPDATE_DIALOG2 then if self.createOverlayRadioButton:Value() then self.opacityValueInput:Enable(true) self.strokeWidthValueInput:Enable(self.changeStrokeWidthCheckbox:Value()) self.doNotRenderCheckbox:Enable(self.createOverlayRadioButton:Value()) self.selectNewOverlayLayerCheckbox:Enable(self.createOverlayRadioButton:Value()) self.replaceOverlayLayerCheckbox:Enable(self.createOverlayRadioButton:Value()) self.visibleLayersOnlyCheckbox:Enable(self.createOverlayRadioButton:Value()) self.recolorStrokeCheckbox:Enable(self.createOverlayRadioButton:Value()) self.preserveStrokeAlphaCheckbox:Enable(self.recolorStrokeCheckbox:Value()) self.strokesOnlyCheckbox:Enable(true) self.changeStrokeWidthCheckbox:Enable(self.createOverlayRadioButton:Value()) self.flipCheckbox:Enable(true) self.selectionCenterRadioButton:Enable(self.flipCheckbox:Value()) self.layerOriginCenterRadioButton:Enable(self.flipCheckbox:Value()) self.customflipCenterRadioButton:Enable(self.flipCheckbox:Value()) self.createOverlayFromFrameCheckbox:Enable(true) self.frame1RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frame2RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frame3RadioButton:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText1Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText2Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.frameText3Input:Enable(self.createOverlayFromFrameCheckbox:Value()) self.strokeColorSwatch:Enable(self.recolorStrokeCheckbox:Value()) self.overlayLayerOpacityText:Enable(true) self.mirrorFlipCheckbox:Enable(self.flipCheckbox:Value()) self.autoSelectPointsCheckbox:Enable(true) else self.opacityValueInput:Enable(false) self.strokeWidthValueInput:Enable(false) self.doNotRenderCheckbox:Enable(false) self.selectNewOverlayLayerCheckbox:Enable(false) self.replaceOverlayLayerCheckbox:Enable(false) self.visibleLayersOnlyCheckbox:Enable(false) self.recolorStrokeCheckbox:Enable(false) self.preserveStrokeAlphaCheckbox:Enable(false) self.strokesOnlyCheckbox:Enable(false) self.changeStrokeWidthCheckbox:Enable(false) self.flipCheckbox:Enable(false) self.selectionCenterRadioButton:Enable(false) self.layerOriginCenterRadioButton:Enable(false) self.customflipCenterRadioButton:Enable(false) self.createOverlayFromFrameCheckbox:Enable(false) self.frame1RadioButton:Enable(false) self.frame2RadioButton:Enable(false) self.frame3RadioButton:Enable(false) self.frameText1Input:Enable(false) self.frameText2Input:Enable(false) self.frameText3Input:Enable(false) self.strokeColorSwatch:Enable(false) self.overlayLayerOpacityText:Enable(false) self.mirrorFlipCheckbox:Enable(false) self.autoSelectPointsCheckbox:Enable(false) end if self.GetCustomCenterRadioButton:Value() then self.useShapeForPivotCheckbox:Enable(self.autoSelectPointsCheckbox:Value()) else self.useShapeForPivotCheckbox:Enable(false) end elseif msg == self.FRAME1 then self.frame1RadioButton:SetValue(true) self.frame2RadioButton:SetValue(false) self.frame3RadioButton:SetValue(false) elseif msg == self.FRAME2 then self.frame1RadioButton:SetValue(false) self.frame2RadioButton:SetValue(true) self.frame3RadioButton:SetValue(false) elseif msg == self.FRAME3 then self.frame1RadioButton:SetValue(false) self.frame2RadioButton:SetValue(false) self.frame3RadioButton:SetValue(true) end end -- ************************************************** -- The guts of this script -- ************************************************** function MR_Overlay:Run(moho) self.numVers = {} local vers = moho:AppVersion() for n in string.gmatch (vers, "%d+") do table.insert(self.numVers, tonumber(n)) end self.isVBAvaible = false if self.numVers[1] == 13 and self.numVers[2] == 5 then self.isVBAvaible = true elseif self.numVers[1] == 13 and self.numVers[2] > 5 then self.isVBAvaible = true elseif self.numVers[1] > 13 then self.isVBAvaible = true end self.overlayLayer = self:CheckExistOverlayLayer(moho) local curLayer = moho.layer local curFrame = moho.frame self:ScanLayers(moho, false) if self.layersToOverlay[1] == nil and moho.layer == self.overlayLayer then self.onlyOverlaySelected = true self.createOverlay = false self.pickCustomCenter = true else self.onlyOverlaySelected = false end local dlog = MR_OverlayDialog:new(moho) if (dlog:DoModal() == LM.GUI.MSG_CANCEL) then moho:SetCurFrame(curFrame) return end if self.deleteOverlay and self.overlayLayer then self:DeleteOverlayLayer(moho, self.overlayLayer) elseif self.hideOverlay and self.overlayLayer then self.overlayLayer:SetVisible(false) elseif self.showOverlay and self.overlayLayer then self.overlayLayer:SetVisible(true) elseif self.convertOverlay and self.overlayLayer then self:ConvertOverlayLayer(moho, self.overlayLayer) elseif self.pickCustomCenter then self:PickCustomCenter(moho, moho.layer) end if self.createOverlayFromFrame then if self.useFrame1 then moho:SetCurFrame(self.frameVal1) elseif self.useFrame2 then moho:SetCurFrame(self.frameVal2) elseif self.useFrame3 then moho:SetCurFrame(self.frameVal3) end else moho:SetCurFrame(curFrame) end if not self.createOverlay then moho:SetCurFrame(curFrame) return end self:ScanLayers(moho, true) if self.layersToOverlay[1] == nil then moho:SetCurFrame(curFrame) return end if self.overlayLayer and self.replaceOverlayLayer then moho.document:PrepUndo(self.overlayLayer) else moho.document:PrepUndo(nil) end moho.document:SetDirty() local curName = moho.layer:Name() local curAction = moho.document:CurrentDocAction() local currentQualityFlags = moho.view:QualityFlags() local wireframe = MOHO.hasbit(moho.view:QualityFlags(), MOHO.bit(MOHO.LDQ_WIREFRAME)) if wireframe then moho.view:SetQualityFlags(currentQualityFlags - MOHO.LDQ_WIREFRAME) end if #self.layersToOverlay > 1 then curName = 'Multilayer' end local posList = {} local curveList = {} local skelControl = false local skelLayer = curLayer:ControllingBoneLayer() local skel = nil if skelLayer ~= nil then skel = skelLayer:Skeleton() skelControl = true end for k, id in ipairs(self.layersToOverlay) do local layer = moho:LayerAsVector(moho.document:LayerByAbsoluteID(id)) local layerMesh = layer:Mesh() local layerPosList = {} if self.autoSelectPoints then layerMesh:SelectAll() else layerMesh:SelectConnected() end for i = 0, layerMesh:CountPoints() - 1 do local pt = layerMesh:Point(i) if (pt.fSelected) then local globalPointPos = LM.Vector2:new_local() globalPointPos:Set(pt.fPos) globalPointPos = self:GetGlobalPointPos(moho, globalPointPos, layer) table.insert(layerPosList, globalPointPos) end end table.insert(posList, layerPosList) end for k, id in ipairs(self.layersToOverlay) do local layer = moho:LayerAsVector(moho.document:LayerByAbsoluteID(id)) local layerMesh = layer:Mesh() local layerCurveList = {} for i = 0, layerMesh:CountCurves() - 1 do local curve = layerMesh:Curve(i) local handlePosList = {} handlePosList.inV = {} handlePosList.outV = {} local isCurveSelected = false for j = 0, curve:CountPoints() - 1 do if curve:Point(j).fSelected then isCurveSelected = true local handlePosIn = curve:GetControlHandle(j, moho.frame, true) local handlePosOut = curve:GetControlHandle(j, moho.frame, false) handlePosIn = self:GetGlobalPointPos(moho, handlePosIn, layer) handlePosOut = self:GetGlobalPointPos(moho, handlePosOut, layer) table.insert(handlePosList.inV, handlePosIn) table.insert(handlePosList.outV, handlePosOut) end end if isCurveSelected then table.insert(layerCurveList, handlePosList) end end table.insert(curveList, layerCurveList) end if curAction ~= '' then moho.document:SetCurrentDocAction(nil) moho.layer:ActivateAction(nil) end local topLayer = moho.document:Layer(moho.document:CountLayers()-1) moho:SetSelLayer(topLayer) local overlayLayer = nil if self.replaceOverlayLayer then local scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then local topLayerMesh = moho:LayerAsVector(topLayer):Mesh() if topLayerMesh ~= nil then topLayerMesh:Clear() overlayLayer = topLayer overlayLayer:SetVisible(true) moho.view:DrawMe() end else if (scriptData:HasKey("MR Guides Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() moho:SetSelLayer(topLayer) if (scriptData:HasKey("MR Overlay Layer")) then local topLayerMesh = moho:LayerAsVector(topLayer):Mesh() if topLayerMesh ~= nil then topLayerMesh:Clear() overlayLayer = topLayer overlayLayer:SetVisible(true) moho.view:DrawMe() end elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-3) scriptData = topLayer:ScriptData() moho:SetSelLayer(topLayer) if (scriptData:HasKey("MR Overlay Layer")) then local topLayerMesh = moho:LayerAsVector(topLayer):Mesh() if topLayerMesh ~= nil then topLayerMesh:Clear() overlayLayer = topLayer overlayLayer:SetVisible(true) moho.view:DrawMe() end else overlayLayer = self:CreateNewLayer(moho) end else overlayLayer = self:CreateNewLayer(moho) end elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() moho:SetSelLayer(topLayer) if (scriptData:HasKey("MR Overlay Layer")) then local topLayerMesh = moho:LayerAsVector(topLayer):Mesh() if topLayerMesh ~= nil then topLayerMesh:Clear() overlayLayer = topLayer overlayLayer:SetVisible(true) moho.view:DrawMe() end else overlayLayer = self:CreateNewLayer(moho) end else overlayLayer = self:CreateNewLayer(moho) end end else local scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Guides Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then moho:SetSelLayer(topLayer) overlayLayer = self:CreateNewLayer(moho) elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-3) moho:SetSelLayer(topLayer) overlayLayer = self:CreateNewLayer(moho) else moho:SetSelLayer(topLayer) overlayLayer = self:CreateNewLayer(moho) end elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() moho:SetSelLayer(topLayer) overlayLayer = self:CreateNewLayer(moho) else overlayLayer = self:CreateNewLayer(moho) end end overlayLayer:SetName(curName.. self.layerSuffix) overlayLayer.fAlpha:SetValue(0, self.opacityValue / 100) if self.doNotRender then overlayLayer:SetEditOnly(true) else overlayLayer:SetEditOnly(false) end local newMesh = moho:LayerAsVector(overlayLayer):Mesh() local layerCounter = 1 local blackColorRGB = LM.rgb_color:new_local() blackColorRGB.r = 0 blackColorRGB.g = 0 blackColorRGB.b = 0 blackColorRGB.a = 255 local shapeCounter = 0 for k, id in ipairs(self.layersToOverlay) do local layer = moho.document:LayerByAbsoluteID(id) local vectorLayer = moho:LayerAsVector(layer) moho:SetSelLayer(layer) if curAction ~= '' then moho.document:SetCurrentDocAction(curAction) layer:ActivateAction(curAction) end local layerMesh = vectorLayer:Mesh() if self.autoSelectPoints then layerMesh:SelectAll() else layerMesh:SelectConnected() end local shapesOrderList = {} local shapesList = {} shapesList.shapeIDs = {} shapesList.originalNames = {} shapesList.names = {} shapesList.colorsStroke = {} shapesList.colorsFill = {} if layerMesh:AnimatedShapeOrder() then local orderChannel = self:GetShapeOrderChannel(moho, layer) local orderValue orderValue = orderChannel.value:Buffer() local lastId = -1 layerMesh = vectorLayer:Mesh() for n in string.gmatch(orderValue, "[^|]+") do local shapeId = tonumber(n) if shapeId ~= lastId then local shape = layerMesh:ShapeByID(shapeId) if shape then table.insert(shapesOrderList, shapeId) end lastId = shapeId end end else for i = 0, layerMesh:CountShapes() - 1 do local shape = layerMesh:Shape(i) if shape then table.insert(shapesOrderList, shape:ShapeID()) end end end for i, id in pairs(shapesOrderList) do local shapeId = id local shape = layerMesh:ShapeByID(shapeId) if shape then for p = 0, layerMesh:CountPoints()-1 do local point = layerMesh:Point(p) if point.fSelected and shape:ContainsPoint(p) then local newName = 'Layer '..layerCounter..' '..moho.layer:Name()..' Shape '..shapeCounter shapeCounter = shapeCounter + 1 table.insert(shapesList.shapeIDs, shapeId) table.insert(shapesList.originalNames, shape:Name()) table.insert(shapesList.names, newName) if shape.fHasFill then local color = LM.rgb_color:new_local() color.r = shape.fMyStyle.fFillCol.value.r color.g = shape.fMyStyle.fFillCol.value.g color.b = shape.fMyStyle.fFillCol.value.b color.a = shape.fMyStyle.fFillCol.value.a table.insert(shapesList.colorsFill, color) else table.insert(shapesList.colorsFill, blackColorRGB) end if shape.fHasOutline then local color = LM.rgb_color:new_local() color.r = shape.fMyStyle.fLineCol.value.r color.g = shape.fMyStyle.fLineCol.value.g color.b = shape.fMyStyle.fLineCol.value.b color.a = shape.fMyStyle.fLineCol.value.a table.insert(shapesList.colorsStroke, color) else table.insert(shapesList.colorsStroke, blackColorRGB) end shape:SetName(newName) break end end end end layerCounter = layerCounter + 1 local offset = LM.Vector2:new_local() offset:Set(0, 1) local zeroOffset = LM.Vector2:new_local() zeroOffset:Set(0, 0) offset = self:GetGlobalPointPos(moho, offset, layer) zeroOffset = self:GetGlobalPointPos(moho, zeroOffset, layer) local layerTransfotmation = self:GetDistance(offset, zeroOffset) moho:Copy(layerMesh) moho:SetSelLayer(overlayLayer) local layerPoints = newMesh:CountPoints() local layerCurves = newMesh:CountCurves() moho:Paste() overlayLayer:ClearAnimation(true, 0, false) if curAction ~= '' then moho.document:SetCurrentDocAction(nil) layer:ActivateAction(nil) end newMesh = moho:LayerAsVector(overlayLayer):Mesh() for i = 1, #shapesList.shapeIDs do local newShape = newMesh:ShapeByName(shapesList.names[i]) local newShapeID = newMesh:ShapeID(newShape) if newShape then newMesh:RaiseShape(newShapeID, true) if newShape.fHasOutline then newShape.fMyStyle.fLineCol:SetValue(0, shapesList.colorsStroke[i]) newShape.fMyStyle.fLineWidth = newShape.fMyStyle.fLineWidth * layerTransfotmation end if newShape.fHasFill then newShape.fMyStyle.fFillCol:SetValue(0, shapesList.colorsFill[i]) end end local originalShape = layerMesh:ShapeByID(shapesList.shapeIDs[i]) originalShape:SetName(shapesList.originalNames[i]) end for i, a in pairs(posList[k]) do local pointID = i-1 + layerPoints if pointID <= newMesh:CountPoints() then local pt = newMesh:Point(pointID) if (pt.fSelected) then pt.fAnimPos:SetValue(0, posList[k][i]) end end end overlayLayer:ClearAnimation(true, 0, false) overlayLayer:UpdateCurFrame() for i, a in pairs(curveList[k]) do local curveID = i - 1 + layerCurves if curveID <= newMesh:CountCurves() then local curve = newMesh:Curve(i - 1 + layerCurves) for e, b in pairs(curveList[k][i].inV) do local pn = e-1 curve:SetControlHandle(e -1, curveList[k][i].inV[e], moho.frame, true, false) curve:SetControlHandle(e-1, curveList[k][i].outV[e], moho.frame, false, false) end end end local curvature = 0 local curve = nil local ptPos = -1 local newMeshPoints = newMesh:CountPoints() for i = 0, newMeshPoints - 1 do local pointID = i + layerPoints if pointID <= newMeshPoints - 1 then local pt = newMesh:Point(i + layerPoints) if pt then for j = 0, pt:CountCurves() - 1 do curve, ptPos = pt:Curve(j + layerPoints, ptPos) curve:SetCurvature(ptPos, curve:GetCurvature(ptPos, moho.frame), 0) curve:SetWeight(ptPos, curve:GetWeight(ptPos, moho.frame, true), 0, true) curve:SetWeight(ptPos, curve:GetWeight(ptPos, moho.frame, false), 0, false) curve:SetOffset(ptPos, curve:GetOffset(ptPos, moho.frame, true), 0, true) curve:SetOffset(ptPos, curve:GetOffset(ptPos, moho.frame, false), 0, false) end end end end end if self.strokesOnly then for i = 0, newMesh:CountShapes() - 1 do local shape = newMesh:Shape(i) if (shape ~= nil) then shape.fHasFill = false end end end if self.recolorStroke then local color = LM.rgb_color:new_local() color.r = self.strokeColorR color.g = self.strokeColorG color.b = self.strokeColorB color.a = self.strokeColorA if (style ~= nil) then style.fLineCol:SetValue(0, color) end for i = 0, newMesh:CountShapes() - 1 do local shape = newMesh:Shape(i) if (shape ~= nil) then if self.preserveStrokeAlpha then color.a = shape.fMyStyle.fLineCol.value.a else color.a = self.strokeColorA end shape.fMyStyle.fLineCol:SetValue(0, color) end end end if self.changeStrokeWidth then local lineWidth = self.strokeWidth lineWidth = LM.Clamp(lineWidth, 0.25, 256) for i = 0, newMesh:CountShapes() - 1 do local shape = newMesh:Shape(i) if (shape ~= nil) then shape.fMyStyle.fLineWidth = lineWidth / moho.document:Height() end end end if self.flipOverlay then local layerPoints = newMesh:CountPoints() local pointsDif = 0 if self.mirrorFlip then pointsDif = layerPoints moho:Copy(newMesh) moho:Paste() end local centerVec = LM.Vector2:new_local() if self.selectionCenter then local minAll = LM.Vector2:new_local() local maxAll = LM.Vector2:new_local() minAll:Set(1000000, 1000000) maxAll:Set(-1000000, -1000000) for i = 0, newMesh:CountShapes() - 1 do local shape = newMesh:Shape(i) local min = LM.Vector2:new_local() local max = LM.Vector2:new_local() shape:ShapeBounds(min, max, 0) if min.x < minAll.x then minAll.x = min.x end if min.y < minAll.y then minAll.y = min.y end if max.x > maxAll.x then maxAll.x = max.x end if max.y > maxAll.y then maxAll.y = max.y end end local center = LM.Vector2:new_local() center:Set(minAll.x + ((maxAll.x - minAll.x) / 2), minAll.y + ((maxAll.y - minAll.y) / 2)) centerVec:Set(self:GetGlobalPointPos(moho, center, overlayLayer)) elseif self.layerOriginCenter then centerVec:Set(self:GetGlobalPointPos(moho, curLayer:Origin(), curLayer)) elseif self.customCenter then centerVec:Set(self.customCenterValueX, self.customCenterValueY) end for i = 0 + pointsDif, newMesh:CountPoints() - 1 do local pt = newMesh:Point(i) local dif = LM.Vector2:new_local() local newPos = LM.Vector2:new_local() dif:Set(centerVec.x - pt.fAnimPos:GetValue(0).x, 0) newPos:Set(centerVec.x + dif.x, pt.fAnimPos:GetValue(0).y) pt.fAnimPos:SetValue(0, newPos) pt:FlipControlHandles(0) end end overlayLayer:ClearAnimation(true, 0, false) if newMesh:CountPoints() > 0 then local firstPoint = newMesh:Point(0) firstPoint.fAnimPos:SetValue(1, firstPoint.fAnimPos:GetValue(0)) end if wireframe then moho.view:SetQualityFlags(currentQualityFlags) end moho.view:DrawMe() local actionsToRemove = {} local actions = overlayLayer:CountActions() local actionName if actions > 0 then for a=0, actions-1 do actionName = overlayLayer:ActionName(a) table.insert(actionsToRemove, actionName) end for _,name in ipairs(actionsToRemove) do overlayLayer:DeleteAction(name) end end self:ReturnToAction(moho, curAction, curLayer, curFrame) if not self.selectNewOverlayLayer then moho:SetSelLayer(curLayer) for _, layer in ipairs(self.secondarySelection) do layer:SetSecondarySelection(true) end end if self.createOverlayFromFrame then moho:SetCurFrame(curFrame) end overlayLayer:UpdateCurFrame() curLayer:UpdateCurFrame() moho:UpdateUI() moho.view:DrawMe() end function MR_Overlay:CreateNewLayer(moho) local overlayLayer = moho:CreateNewLayer(MOHO.LT_VECTOR, false) local scriptData = overlayLayer:ScriptData() scriptData:Set("MR Overlay Layer", true) if self.numVers[1] == 13 and self.numVers[2] == 5 then if self.numVers[3] ~= nil then if self.numVers[3] >= 2 then overlayLayer:SetIgnoredByLayerPicker(true) end end elseif self.numVers[1] == 13 and self.numVers[2] > 5 then overlayLayer:SetIgnoredByLayerPicker(true) elseif self.numVers[1] > 13 then overlayLayer:SetIgnoredByLayerPicker(true) end return overlayLayer end function MR_Overlay:CheckExistOverlayLayer(moho) local topLayer = moho.document:Layer(moho.document:CountLayers()-1) local overlayLayer = nil local scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then overlayLayer = moho:LayerAsVector(topLayer) elseif (scriptData:HasKey("MR Guides Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then overlayLayer = moho:LayerAsVector(topLayer) elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-3) scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then overlayLayer = moho:LayerAsVector(topLayer) end end elseif (scriptData:HasKey("MR Path Layer")) then topLayer = moho.document:Layer(moho.document:CountLayers()-2) scriptData = topLayer:ScriptData() if (scriptData:HasKey("MR Overlay Layer")) then overlayLayer = moho:LayerAsVector(topLayer) end end return overlayLayer end function MR_Overlay:ConvertOverlayLayer(moho, overlLayer) moho.document:PrepUndo(overlLayer) moho.document:SetDirty() local scriptData = overlLayer:ScriptData() scriptData:Remove("MR Overlay Layer") local newName = overlLayer:Name() if string.sub(overlLayer:Name(), overlLayer:Name():len() - self.layerSuffix:len() +1) == self.layerSuffix then newName = string.sub(overlLayer:Name(), 0,-(self.layerSuffix:len() +1)) if newName == 'Multilayer' then newName = 'Converted Overlay' end overlLayer:SetName(newName) end overlLayer:SetVisible(true) overlLayer.fAlpha:SetValue(0, 1) overlLayer:SetEditOnly(false) overlLayer:UpdateCurFrame() moho.view:DrawMe() moho:UpdateUI() end function MR_Overlay:DeleteOverlayLayer(moho, overlLayer) local curLayer = moho.layer local curAction = moho.layer:CurrentAction() local curFrame = moho.frame local overlayLayer = overlLayer if overlayLayer ~= nil then moho.document:PrepUndo(nil) moho.document:SetDirty() if not self.onlyOverlaySelected then local parentGroup = curLayer:Parent() moho:DeleteLayer(overlayLayer) if curAction ~= '' then self:ReturnToAction(moho, curAction, curLayer, curFrame) else moho:SetSelLayer(curLayer) end if curFrame > 0 then moho:SetCurFrame(0) moho:SetCurFrame(curFrame) elseif curFrame == 0 then moho:SetCurFrame(1) moho:SetCurFrame(curFrame) end curLayer:UpdateCurFrame() else local topLayer = moho.document:Layer(moho.document:CountLayers()-2) moho:DeleteLayer(overlayLayer) moho:SetSelLayer(topLayer) end moho.view:DrawMe() moho:UpdateUI() moho:UpdateSelectedChannels() end end function MR_Overlay:PickCustomCenter(moho, layer) local centerPos = LM.Vector2:new_local() local centerFound = false if moho:LayerAsVector(layer) then local mesh = moho:LayerAsVector(layer):Mesh() if self.useShapeForPivot and mesh:CountShapes() > 0 then local minAll = LM.Vector2:new_local() local maxAll = LM.Vector2:new_local() minAll:Set(1000000, 1000000) maxAll:Set(-1000000, -1000000) for i = 0, mesh:CountShapes() - 1 do local shape = mesh:Shape(i) local min = LM.Vector2:new_local() local max = LM.Vector2:new_local() shape:ShapeBounds(min, max, 0) if min.x < minAll.x then minAll.x = min.x end if min.y < minAll.y then minAll.y = min.y end if max.x > maxAll.x then maxAll.x = max.x end if max.y > maxAll.y then maxAll.y = max.y end end centerFound = true local center = LM.Vector2:new_local() center:Set(minAll.x + ((maxAll.x - minAll.x) / 2), minAll.y + ((maxAll.y - minAll.y) / 2)) centerPos:Set(self:GetGlobalPointPos(moho, center, layer)) else local selectedPoints = false for i = 0, mesh:CountPoints() - 1 do local pt = mesh:Point(i) if (pt.fSelected) then selectedPoints = true break end end if selectedPoints then centerFound = true centerPos:Set(self:GetGlobalPointPos(moho, mesh:SelectedCenter(), layer)) end end end if not centerFound then centerPos:Set(self:GetGlobalPointPos(moho, layer:Origin(), layer)) end self.customCenterValueX = centerPos.x self.customCenterValueY = centerPos.y end function MR_Overlay:GetGlobalPointPos(moho, pointPosition, layer) local pointPos = LM.Vector2:new_local() pointPos:Set(pointPosition) local layerMatrix = LM.Matrix:new_local() layer:GetFullTransform(moho.frame, layerMatrix, nil) layerMatrix:Transform(pointPos) return pointPos end function MR_Overlay:ScanLayers(moho, autoSelect) self.layersToOverlay = {} self.secondarySelection = {} for l = 0, moho.document:CountSelectedLayers()-1 do local layer = moho.document:GetSelectedLayer(l) if layer ~= moho.layer then table.insert(self.secondarySelection, layer) end if moho:LayerAsVector(layer) then local isLayerOk = true if self.visibleLayersOnly then isLayerOk = self:IsLayerVisible(moho, layer) if layer:SecondarySelection() then isLayerOk = true end end if isLayerOk then local mesh = moho:LayerAsVector(layer):Mesh() local selectedPoints = false if self.autoSelectPoints and autoSelect then mesh:SelectAll() end for i = 0, mesh:CountPoints() - 1 do local pt = mesh:Point(i) if (pt.fSelected) then selectedPoints = true break end end if selectedPoints then local isLayerNew = true for k, id in ipairs(self.layersToOverlay) do if layer == moho.document:LayerByAbsoluteID(id) then isLayerNew = false end end if isLayerNew and layer ~= self.overlayLayer then table.insert(self.layersToOverlay, moho.document:LayerAbsoluteID(layer)) end end end elseif layer:IsGroupType() then self:ScanGroup(moho, layer, autoSelect) end end end function MR_Overlay:ScanGroup(moho, group, autoSelect) local groupLayer = moho:LayerAsGroup(group) for i=0, groupLayer:CountLayers()-1 do local layer = group:LayerByDepth(i) if layer:IsGroupType() then self:ScanGroup(moho, layer, autoSelect) -- recursion elseif moho:LayerAsVector(layer) then local isLayerOk = true if self.visibleLayersOnly then isLayerOk = self:IsLayerVisible(moho, layer) if layer:SecondarySelection() then isLayerOk = true end end if isLayerOk then local mesh = moho:LayerAsVector(layer):Mesh() local selectedPoints = false if self.autoSelectPoints and autoSelect then mesh:SelectAll() end for i = 0, mesh:CountPoints() - 1 do local pt = mesh:Point(i) if (pt.fSelected) then selectedPoints = true break end end if selectedPoints then local isLayerNew = true for k, id in ipairs(self.layersToOverlay) do if layer == moho.document:LayerByAbsoluteID(id) then isLayerNew = false end end if isLayerNew then table.insert(self.layersToOverlay, moho.document:LayerAbsoluteID(layer)) end end end end end end function MR_Overlay:ReturnToAction(moho, returnAction, returnLayer, frame) if returnAction ~= '' then local parentGroup = returnLayer:Parent() local skelLayer = nil if returnLayer:LayerType() == 4 and returnLayer:HasAction(returnAction) then skelLayer = returnLayer elseif parentGroup ~= nil then local targetGroup = parentGroup repeat if targetGroup:LayerType() == 4 then -- LT_BONE if targetGroup:HasAction(returnAction) then skelLayer = targetGroup end end targetGroup = targetGroup:Parent() until targetGroup == nil end moho:SetSelLayer(skelLayer) moho.document:SetCurrentDocAction(returnAction) skelLayer:ActivateAction(returnAction) if skelLayer ~= returnLayer then moho:SetSelLayer(returnLayer) returnLayer:ActivateAction(returnAction) end moho:SetCurFrame(frame) end end function MR_Overlay:IsLayerVisible(moho, layer) local layerVisibility = true local skel = layer:ControllingSkeleton() if skel then local parentBoneID = layer:LayerParentBone() if parentBoneID >= 0 and self.isVBAvaible then local bone = skel:Bone(parentBoneID) if not bone:IsGroupVisible() then return false end end end if not layer.fVisibility.value or not layer:IsVisible() then layerVisibility = false elseif layer:IsRenderOnly() then layerVisibility = false elseif layer:MaskingMode() == 5 then layerVisibility = false else local targetLayer = layer:Parent() local lastLayer = layer if targetLayer then repeat if not targetLayer.fVisibility.value or not targetLayer:IsVisible() then layerVisibility = false break end local skel = targetLayer:ControllingSkeleton() if moho:LayerAsBone(targetLayer) then local parentLayer = targetLayer:Parent() if parentLayer then skel = parentLayer:ControllingSkeleton() end end if skel then local parentBoneID = targetLayer:LayerParentBone() if parentBoneID >= 0 and self.isVBAvaible then local bone = skel:Bone(parentBoneID) if not bone:IsGroupVisible() then layerVisibility = false break end end end if targetLayer:LayerType() == MOHO.LT_SWITCH then local switchLayer = moho:LayerAsSwitch(targetLayer) local switchChannel = switchLayer:SwitchValues() local switchValue = switchChannel.value:Buffer() local isSwitchValueCorrect = false for i=0, targetLayer:CountLayers() - 1 do if targetLayer:Layer(i):Name() == switchValue then isSwitchValueCorrect = true break end end if switchValue ~= lastLayer:Name() then if not isSwitchValueCorrect then local targetSwitchLayer = switchLayer:Layer(switchLayer:CountLayers() - 1):Name() if targetSwitchLayer ~= lastLayer:Name() then layerVisibility = false break end else layerVisibility = false break end end end lastLayer = targetLayer targetLayer = targetLayer:Parent() until targetLayer == nil end end if self.isVBAvaible and layerVisibility then local skel = layer:ControllingSkeleton() if not skel then return layerVisibility end local IsInvisibleBoneInSubset = false local IsVisibleBoneInSubset = false local IsParentBone = false local IsParentBoneVisible = false for i=0, skel:CountBones()-1 do local bone = skel:Bone(i) if layer:IsIncludedInFlexiBoneSubset(i) then if bone:IsGroupVisible() then IsVisibleBoneInSubset = true else IsInvisibleBoneInSubset = true end end end if IsInvisibleBoneInSubset and not IsVisibleBoneInSubset then layerVisibility = false end end return layerVisibility end function MR_Overlay:GetShapeOrderChannel(moho, layer) local maxChannel = layer:CountChannels()-1 local chInfo = MOHO.MohoLayerChannel:new_local() local orderChannel = nil for i=0, maxChannel do layer:GetChannelInfo(i, chInfo) if chInfo.channelID == CHANNEL_SHAPE_ORDER then return moho:ChannelAsAnimString(layer:Channel(i, 0, moho.document)) end end end function MR_Overlay:GetDistance(Pos1, Pos2) return math.sqrt((Pos2.x-Pos1.x)^2+(Pos2.y-Pos1.y)^2) end -- ************************************************** -- Localization -- ************************************************** function MR_Overlay:Localize(text) local phrase = {} phrase['Description'] = 'Script allows you to create an “overlay” - a new layer that can be used as a visual reference. The content of the layer is based on the selected points or vector layers. You can choose the color and line width, turn off the fills and mirror the overlay.' phrase['UILabel'] = 'MR Overlay 1.3' phrase['opacity'] = 'Overlay Layer Opacity:' phrase['Opacity Tooltip'] = 'Opacity of the newly created overlay layer. 100 - completely opaque, 0 - completely transparent.' phrase['Do Not Render'] = 'Do Not Render Overlay' phrase['Do Not Render Tooltip'] = "Check if you don't want the newly created overlay layer to appear in the rendered image." phrase['Select New Overlay Layer'] = 'Select New Overlay Layer' phrase['Select new overlay Tooltip'] = 'Select new overlay layer and remove selection from the current layer.' phrase['Update Overlay Layer'] = 'Update Existing Overlay Layer' phrase['Update top overlay Tooltip'] = 'Update the topmost overlay layer, if exists.' phrase['Recolor Stroke'] = 'Recolor Stroke:' phrase['Recolor Stroke Tooltip'] = 'The color of the strokes in the newly created overlay layer.' phrase['Strokes Only'] = 'Strokes Only' phrase['Strokes Only Tooltip'] = 'If checked, only strokes will be created, no fills.' phrase['Change Stroke Width'] = 'Change Stroke Width:' phrase['Change Stroke Width Toolip'] = 'The width of the strokes in the newly created overlay layer.' phrase['Hide Overlay'] = 'Hide Overlay' phrase['Hide Overlay Tooltip'] = 'Hide the topmost existing overlay layer.' phrase['Show Overlay'] = 'Show Overlay' phrase['Show Overlay Tooltip'] = 'Show the topmost existing overlay layer.' phrase['Delete Overlay'] = 'Delete Overlay' phrase['Delete Overlay Tooltip'] = 'Delete the topmost overlay layer.' phrase['Convert Overlay'] = 'Convert Overlay' phrase['Convert Overlay Tooltip'] = 'Convert existing overlay to a normal layer.' phrase['Flip'] = 'Flip Overlay' phrase['Flip Tooltip'] = 'These controls are responsible for the pivot position and flip settings.' phrase['Selection Center'] = 'Selection Center' phrase['Selection Center Tooltip'] = 'Use selection\'s center for flip pivot' phrase['Layer Origin'] = 'Layer Origin' phrase['Layer Origin Tooltip'] = 'Use layer\'s origin for flip pivot' phrase['Custom Center'] = 'Custom Pivot' phrase['Custom Center Tooltip'] = 'Use custom pivot for flip' phrase['Get Custom Center'] = 'Set Custom Pivot' phrase['Get Custom Center Tooltip'] = 'If there are points selected, the pivot will be set to the center of the selection. If no points selected, the pivot will be set to the layer\'s origin.' phrase['Create Overlay From Frame:'] = 'Create From Frame:' phrase['Create Overlay From Frame Tooltip'] = 'These settings allow you to create the overlay based on a particular frame instead of the current one.' phrase['Frame'] = 'Frame:' phrase['Auto Update Points'] = 'Auto Select Points' phrase['Auto Update Points Tooltip'] = 'Automatically select all points.' phrase['Create Overlay'] = 'Create Overlay' phrase['Mirror Flip'] = 'Mirror Flip' phrase['Mirror Flip Tooltip'] = 'Show original overlay and flipped one.' phrase['Create Overlay Tooltip'] = 'Create overlay layer or update existing one.' phrase['Use Shapes Center'] = 'Use Shapes Center' phrase['Use Shapes Center Tooltip'] = 'When this option turned on, the pivot will be placed to the center of the shapes instead of points center, which may be different.' phrase[' '] = ' ' phrase['Visible Layers Only'] = 'Visible Layers Only' phrase['Visible Layers Only Tooltip'] = 'Use only visible layers for overlay' phrase['Preserve Strokes Alpha'] = 'Preserve Strokes Alpha' phrase['Preserve Strokes Alpha Tooltip'] = 'When this option turned on, each stroke will preserve its original alpha value.' local fileWord = MOHO.Localize("/Menus/File/File=File") if fileWord == "Файл" then phrase['Description'] = 'Скрипт позволяет создать слой на базе выделенных точек или векторных слоёв для отображения содержимого поверх всех слоёв как ориентир. Так же скрипт позволяет настраивать цвет и ширину контура оверлея, отключать заливку и отражать оверлей.' phrase['UILabel'] = 'Оверлей 1.3' phrase['opacity'] = 'Прозрачность оверлея:' phrase['Opacity Tooltip'] = 'Прозрачность создаваемого оверлея. 100 - полностью непрозрачен, 0 - полностью прозрачен.' phrase['Do Not Render'] = 'Не рендерить оверлей' phrase['Do Not Render Tooltip'] = "Включите, если вы не хотите, что бы оверлей отображался на рендере." phrase['Select New Overlay Layer'] = 'Выделить оверлей' phrase['Select new overlay Tooltip'] = 'Перевести выделение на оверлей. Иначе текущий слой останется выделенным.' phrase['Update Overlay Layer'] = 'Обновить существущий оверлей' phrase['Update top overlay Tooltip'] = 'Обновить верхний оверлей, если он существует.' phrase['Recolor Stroke'] = 'Перекрасить контур:' phrase['Recolor Stroke Tooltip'] = 'Цвет контура в создаваемом оверлее.' phrase['Strokes Only'] = 'Только контур' phrase['Strokes Only Tooltip'] = 'Еслои включен, будет создан только контур без заливок.' phrase['Change Stroke Width'] = 'Изменить ширину контура:' phrase['Change Stroke Width Toolip'] = 'Ширина контура в создаваемом оверлее.' phrase['Hide Overlay'] = 'Выключить видимость оверлея' phrase['Hide Overlay Tooltip'] = 'Выключить видимость верхнего оверлея.' phrase['Show Overlay'] = 'Включить видимость оверлея' phrase['Show Overlay Tooltip'] = 'Включить видимость верхнего оверлея.' phrase['Delete Overlay'] = 'Удалить оверлей' phrase['Delete Overlay Tooltip'] = 'Удалить верхний существующий оверлей.' phrase['Convert Overlay'] = 'Конвертировать оверлей' phrase['Convert Overlay Tooltip'] = 'Конвертировать оверлей в обычный слой.' phrase['Flip'] = 'Отразить оверлей' phrase['Flip Tooltip'] = 'Эти опции отвечают за позицию пивота и настройки отзеркаливания оверлея.' phrase['Selection Center'] = 'Центр выделения' phrase['Selection Center Tooltip'] = 'Использовать центр выделенных точек для пивота.' phrase['Layer Origin'] = 'Ориджн слоя' phrase['Layer Origin Tooltip'] = 'Использовать ориджин слоя для пивота.' phrase['Custom Center'] = 'Настраиваемый пивот' phrase['Custom Center Tooltip'] = 'Использовать настраиваемый пивот.' phrase['Get Custom Center'] = 'Установить пивот' phrase['Get Custom Center Tooltip'] = 'Если выделены точки, пивот будет установлен в выделения. Если точки не выделены, пивот установится в ориджин слоя.' phrase['Create Overlay From Frame:'] = 'Создать с кадра:' phrase['Create Overlay From Frame Tooltip'] = 'Эти настройки позволяют создавать оверлей базируясь на заданном кадре, а не на текущем.' phrase['Frame'] = 'Кадр:' phrase['Auto Update Points'] = 'Авто выделение точек' phrase['Auto Update Points Tooltip'] = 'Автоматически выделять все точки.' phrase['Create Overlay'] = 'Создать оверлей' phrase['Create Overlay Tooltip'] = 'Создать слой овелея или обновить существующий.' phrase['Mirror Flip'] = 'Отзеркалить' phrase['Mirror Flip Tooltip'] = 'Показать оригинальный и отражонный оверлей.' phrase['Use Shapes Center'] = 'Использовать центр форм' phrase['Use Shapes Center Tooltip'] = 'Когда эта опция включена, пивот будет взят из центра форм вместо центра точек, так как они не всегда совпадают.' phrase[' '] = ' ' phrase['Visible Layers Only'] = 'Только видимые слои' phrase['Visible Layers Only Tooltip'] = 'Оверлей будет построен базируясь только на видимых в данный момент слоях.' phrase['Preserve Strokes Alpha'] = 'Не менять прозрачность контура' phrase['Preserve Strokes Alpha Tooltip'] = 'Когда эта опция включена, каждый контур сохранит своё оригинальное значение.' end return phrase[text] end
MR Overlay
Listed
Author: eugenebabich
View Script
Script type: Button/Menu
Uploaded: Dec 06 2021, 02:59
Last modified: Sep 19 2023, 03:36
Script Version: 1.3.1
Script allows you to create an “overlay” - a new layer that can be used as a visual reference.
This script, and all other scripts on this site are distributed as free software under the GNU General Public License 3.0 or later.
Downloads count: 2147
MR Overlay
Listed
Author: eugenebabich
View Script
Script type: Button/Menu
Uploaded: Dec 06 2021, 02:59
Last modified: Sep 19 2023, 03:36
Script Version: 1.3.1
Script allows you to create an “overlay” - a new layer that can be used as a visual reference.
This script, and all other scripts on this site are distributed as free software under the GNU General Public License 3.0 or later.
Downloads count: 2147