-- ************************************************** -- Provide Moho with the name of this script object -- ************************************************** ScriptName = "SZ_AdjustLineWidth" -- ************************************************** -- General information about this script -- ************************************************** SZ_AdjustLineWidth = {} function SZ_AdjustLineWidth:Name() return self:Localize("Name") end function SZ_AdjustLineWidth:Version() return "1.01" end function SZ_AdjustLineWidth:Description() return self:Localize("Description") end function SZ_AdjustLineWidth:Creator() return "Stan from 2danimator.ru" end function SZ_AdjustLineWidth:UILabel() return self:Localize("UILabel") end -- ************************************************** -- Recurring values -- ************************************************** SZ_AdjustLineWidth.modifier1 = 10 SZ_AdjustLineWidth.modifier2 = 1.10 SZ_AdjustLineWidth.width = 100 SZ_AdjustLineWidth.createKeyframe = false SZ_AdjustLineWidth.layersToChange = {} -- ************************************************** -- Is Relevant / Is Enabled -- ************************************************** function SZ_AdjustLineWidth:IsEnabled(moho) return true end function SZ_AdjustLineWidth:IsRelevant(moho) return true end function SZ_AdjustLineWidth:OnMouseDown(moho, mouseEvent) end -- ************************************************** -- Tool options - create and respond to tool's UI -- ************************************************** SZ_AdjustLineWidth.MODIFIER1 = MOHO.MSG_BASE SZ_AdjustLineWidth.ADD = MOHO.MSG_BASE+1 SZ_AdjustLineWidth.SUBTRACT = MOHO.MSG_BASE+2 SZ_AdjustLineWidth.MODIFIER2 = MOHO.MSG_BASE+3 SZ_AdjustLineWidth.DIVIDE = MOHO.MSG_BASE+4 SZ_AdjustLineWidth.MULTIPLY = MOHO.MSG_BASE+5 SZ_AdjustLineWidth.WIDTH = MOHO.MSG_BASE+6 SZ_AdjustLineWidth.APPLY_WIDTH = MOHO.MSG_BASE+7 SZ_AdjustLineWidth.KEYFRAME = MOHO.MSG_BASE+8 function SZ_AdjustLineWidth:DoLayout(moho, layout) layout:AddChild(LM.GUI.StaticText(self:Localize("Modifier1"))) self.modifier1Field = LM.GUI.TextControl(0, "0000", self.MODIFIER1, LM.GUI.FIELD_UFLOAT) self.modifier1Field:SetWheelInc(10) layout:AddChild(self.modifier1Field) self.add = LM.GUI.Button(self:Localize("Add"), self.ADD) layout:AddChild(self.add) self.subtract = LM.GUI.Button(self:Localize("Subtract"), self.SUBTRACT) layout:AddChild(self.subtract) layout:AddPadding(2) layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) layout:AddPadding(2) layout:AddChild(LM.GUI.StaticText(self:Localize("Modifier2"))) self.modifier2Field = LM.GUI.TextControl(0, "0000", self.MODIFIER2, LM.GUI.FIELD_UFLOAT) self.modifier2Field:SetWheelInc(.1) layout:AddChild(self.modifier2Field) self.multiply = LM.GUI.Button(self:Localize("Multiply"), self.MULTIPLY) layout:AddChild(self.multiply) self.divide = LM.GUI.Button(self:Localize("Divide"), self.DIVIDE) layout:AddChild(self.divide) layout:AddPadding(2) layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) layout:AddPadding(2) layout:AddChild(LM.GUI.StaticText(self:Localize("SetAllTo"))) self.widthField = LM.GUI.TextControl(0, "0000", self.WIDTH, LM.GUI.FIELD_UFLOAT) layout:AddChild(self.widthField) self.widthField:SetWheelInc(10) self.applyWidthButton = LM.GUI.Button(self:Localize("ApplyWidth"), self.APPLY_WIDTH) layout:AddChild(self.applyWidthButton) layout:AddPadding(2) layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) layout:AddPadding(2) self.createKeyframeCB = LM.GUI.CheckBox(self:Localize("CreateKeyframe"), self.KEYFRAME) layout:AddChild(self.createKeyframeCB) layout:AddPadding(2) layout:AddChild(LM.GUI.Divider(true), LM.GUI.ALIGN_FILL) layout:AddPadding(2) self.display = LM.GUI.DynamicText(self:Localize("Shapes").."000000 "..self:Localize("Points").."000000") layout:AddChild(self.display) end function SZ_AdjustLineWidth:UpdateWidgets(moho) self.modifier1Field:SetValue(self.modifier1) self.modifier2Field:SetValue(self.modifier2) self.widthField:SetValue(self.width) self.createKeyframeCB:SetValue(self.createKeyframe) self:UpdateStatistics(moho) end function SZ_AdjustLineWidth:HandleMessage(moho, view, msg) self.modifier1 = self.modifier1Field:FloatValue() self.modifier2 = self.modifier2Field:FloatValue() self.width = self.widthField:FloatValue() if (msg==self.MODIFIER2) then if(self.modifier2<0.000001) then self.modifier2 = 0.000001 self.modifier2Field:SetValue(0.000001) end elseif (msg==self.KEYFRAME) then self.createKeyframe = self.createKeyframeCB:Value() elseif (msg==self.ADD) then self:ChangeStrokeWidth(moho, "add") elseif (msg==self.SUBTRACT) then self:ChangeStrokeWidth(moho, "subtract") elseif (msg==self.MULTIPLY) then self:ChangeStrokeWidth(moho, "multiply") elseif (msg==self.DIVIDE) then self:ChangeStrokeWidth(moho, "divide") elseif (msg==self.APPLY_WIDTH) then self:ChangeStrokeWidth(moho, "apply_width") end end -- ************************************************** -- The guts of this script -- ************************************************** function SZ_AdjustLineWidth:ChangeStrokeWidth(moho, action) moho.document:PrepMultiUndo() moho.document:SetDirty() local docH = moho.document:Height() self:ScanLayers(moho) for k, id in ipairs(self.layersToChange) do local vectorLayer = moho:LayerAsVector(moho.document:LayerByAbsoluteID(id)) local frame = 0 if self.createKeyframe then frame = moho.layerFrame end local mesh = vectorLayer:Mesh() for q=0, mesh:CountPoints()-1 do local point = mesh:Point(q) local w = point.fWidth.value if(w < 0 and w ~= -1) then w = 0 end if (w < 0) then local lineWidth = 0 for i = 0, mesh:CountShapes() - 1 do local shape = mesh:Shape(i) local pointId = mesh:PointID(point) if (shape.fHasOutline and shape:ContainsPoint(pointId)) then lineWidth = shape.fMyStyle.fLineWidth if ((shape.fInheritedStyle ~= nil) and shape.fInheritedStyle.fDefineLineWidth and (not shape.fMyStyle.fDefineLineWidth)) then lineWidth = shape.fInheritedStyle.fLineWidth end if ((shape.fInheritedStyle2 ~= nil) and shape.fInheritedStyle2.fDefineLineWidth and (not shape.fMyStyle.fDefineLineWidth)) then lineWidth = shape.fInheritedStyle2.fLineWidth end break end end point.fWidth:SetValue(frame, lineWidth) w = lineWidth end if (action=="add") then point.fWidth:SetValue(frame, w + (self.modifier1/100)) elseif (action=="subtract") then point.fWidth:SetValue(frame, w - (self.modifier1/100)) elseif (action=="multiply") then point.fWidth:SetValue(frame, w * self.modifier2) elseif (action=="divide" and self.modifier2 ~= 0) then point.fWidth:SetValue(frame, w / self.modifier2) elseif (action=="apply_width") then point.fWidth:SetValue(frame, self.width/100) end end end if self.createKeyframe then moho:NewKeyframe(CHANNEL_WIDTH) self:UpdateWidgets(moho) if moho:LayerAsVector(moho.layer) then moho:UpdateUI() end end end function SZ_AdjustLineWidth:ScanLayers(moho) for k in pairs(self.layersToChange) do self.layersToChange[k] = nil end for l = 0, moho.document:CountSelectedLayers()-1 do local layer = moho.document:GetSelectedLayer(l) if moho:LayerAsVector(layer) then table.insert(self.layersToChange, moho.document:LayerAbsoluteID(layer)) elseif layer:IsGroupType() then self:ScanGroup(moho, layer) end end end function SZ_AdjustLineWidth:ScanGroup(moho, group) local groupLayer = moho:LayerAsGroup(group) for i=0, groupLayer:CountLayers()-1 do local layer = group:Layer(i) if layer:IsGroupType() then self:ScanGroup(moho, layer) -- recursion elseif moho:LayerAsVector(layer) then table.insert(self.layersToChange, moho.document:LayerAbsoluteID(layer)) end end end function SZ_AdjustLineWidth:UpdateStatistics(moho) self:ScanLayers(moho) local shapes = 0 local points = 0 for k, id in ipairs(self.layersToChange) do local VectorLayer = moho:LayerAsVector(moho.document:LayerByAbsoluteID(id)) local mesh = VectorLayer:Mesh() shapes = shapes + mesh:CountShapes() points = points + mesh:CountPoints() end self.display:SetValue(self:Localize("Shapes")..shapes.." "..self:Localize("Points")..points) end -- ************************************************** -- Localization -- ************************************************** function SZ_AdjustLineWidth:Localize(text) local fileWord = MOHO.Localize("/Menus/File/File=File") local phrase = {} phrase["Name"] = "Adjust Line Width" phrase["Description"] = "Adjust the line width for the entire selected layer(s)" phrase["UILabel"] = "Adjust Line Width" phrase["Modifier1"] = "Percentage:" phrase["Add"] = "Add" phrase["Subtract"] = "Subtract" phrase["Modifier2"] = "Coefficient:" phrase["Divide"] = "Divide" phrase["Multiply"] = "Multiply" phrase["SetAllTo"] = "Set All Width To (%):" phrase["ApplyWidth"] = "Apply" phrase["CreateKeyframe"] = "Create Keyframe" phrase["Shapes"] = "Shapes: " phrase["Points"] = "Points: " if fileWord == "Файл" then phrase["Name"] = "Регулировать ширину контура" phrase["Description"] = "Изменяет ширину контура во всех выделенных слоях" phrase["UILabel"] = "Регулировать ширину контура" phrase["Modifier1"] = "Процентное число:" phrase["Add"] = "Прибавить" phrase["Subtract"] = "Вычесть" phrase["Modifier2"] = "Коэффициент:" phrase["Multiply"] = "Умножить" phrase["Divide"] = "Разделить" phrase["SetAllTo"] = "Установить всем ширину (%):" phrase["ApplyWidth"] = "Применить" phrase["CreateKeyframe"] = "Создать ключ" phrase["Shapes"] = "Форм: " phrase["Points"] = "Точек: " end return phrase[text]; end
Adjust Line Width
Listed
Author: Stan
View Script
Script type: Tool
Uploaded: Dec 26 2020, 23:40
Script Version: 1.01
Adjust the line width by adding/subtracting or by multiplying/dividing.
The tool allows to adjust the line width by adding/subtracting a value or by multiplying/dividing by a provided coefficient.
It works for the entire selected layer(s), and supports vector layers and all types of group layers (including switch, bone, etc.) with any nesting depth.
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: 1100
Adjust Line Width
Listed
Author: Stan
View Script
Script type: Tool
Uploaded: Dec 26 2020, 23:40
Script Version: 1.01
Adjust the line width by adding/subtracting or by multiplying/dividing.
The tool allows to adjust the line width by adding/subtracting a value or by multiplying/dividing by a provided coefficient.
It works for the entire selected layer(s), and supports vector layers and all types of group layers (including switch, bone, etc.) with any nesting depth.
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: 1100