It is currently December 5th, 2021, 5:55 pm

PolarCPU / PolarDisk

Skins with graphics and animations
User avatar
killall-q
Posts: 282
Joined: August 14th, 2009, 8:04 am

PolarCPU / PolarDisk

Post by killall-q »

Hello all, after a long hiatus I have released these companion works to PolarPrecise I've been sitting on.



PolarCPU

• Soothing ripples.
• All dimensions changeable through a simple interface.
• Can be shifted partly off-screen in any direction by adjusting the radius of its bounding box.
• Well-optimized for animating at 10-20 frames per second.
• Low activity is dampened to not be annoying.
• Requires Rainmeter 2.1 or above.

Left-click to cycle meter style.
Middle-click to toggle shadow.
Right-click to toggle color / alternate color.
Interaction will bring up the config dialog - mouse away to hide.


I'm curious as to how well it behaves with multi-monitor setups, I would appreciate any feedback. :)





PolarDisk

• Simple interface for changing disk and colors.
• Well-optimized for animating at 20 frames per second.
• Included font is Sinner by Helge Barske; it will not be installed to the system.
• Requires Rainmeter 2.1 or above.

Left-click to open disk.
Middle-click to toggle shadow and bring up config.
Right-click to toggle color / alternate color and bring up config.
Mouse away to hide config.
Last edited by killall-q on January 22nd, 2012, 5:59 pm, edited 2 times in total.
NisseDILLIGAF
Posts: 20
Joined: May 31st, 2011, 7:15 am

Re: PolarCPU

Post by NisseDILLIGAF »

Hi...

Really like this one...!!

I use 2 PolarPyro overlapping showing all 4 CPU cores, one a little smaller showing cores 2-4 in a different color. :)

would be great to have 4 cores in one skin and be able to show them in 4 different colors...
...but I like it as it is also!! Great work!

Thanx!

BTW. I have multi-monitors, and there's no problems here :)

Image
User avatar
killall-q
Posts: 282
Joined: August 14th, 2009, 8:04 am

Re: PolarCPU

Post by killall-q »

Thanks for the action shot! I wanted to support quad and octocores but couldn't fit them in the design... but seeing what you did, I think I have an idea!
NisseDILLIGAF
Posts: 20
Joined: May 31st, 2011, 7:15 am

Re: PolarCPU

Post by NisseDILLIGAF »

No problems.. I'm looking forward to see your ideas :)
killall-q wrote:Thanks for the action shot! I wanted to support quad and octocores but couldn't fit them in the design... but seeing what you did, I think I have an idea!
NisseDILLIGAF
Posts: 20
Joined: May 31st, 2011, 7:15 am

Re: PolarCPU / PolarDisk

Post by NisseDILLIGAF »

I've made a 'PolarCPU' of my own :)
With the help from your code.... (thanx!)
The first time u run it it will see how many cores your CPU has and make a new .ini file with the right number of core rings...
Image
A video of my screen with it running...
http://youtu.be/rqCoDvLUPoY

Next week I will upload the .rmskin ... have a few tweaks todo... :)
User avatar
killall-q
Posts: 282
Joined: August 14th, 2009, 8:04 am

Re: PolarCPU / PolarDisk

Post by killall-q »

I'm honored you based this on my work. That was my plan too, to dynamically detect the number of cores, but I've been busy since first release of PolarCPU. I look forward to seeing your work.
NisseDILLIGAF
Posts: 20
Joined: May 31st, 2011, 7:15 am

Re: PolarCPU / PolarDisk

Post by NisseDILLIGAF »

I forgot about posting my PolarCPU...

Here's the ini file..

coreRunOnce.ini

Code: Select all

[Rainmeter]
;; Only here for generic purposes at the moment.
Update=1000
Author=Zinsho
AppVersion=2000000
BackgroundMode=2
SolidColor=255,255,255,0

; ============================================================================================== ;
; ====	This skin generates a new skin when it is executed, adjusting itself dynamically 	==== ;
; ====	to the number of cores reported by your Operating system. If the reported number	==== ;
; ====	is incorrect you may want to verify your Windows installation.						==== ;
; ====	I created this initially to determine whether Lua could be used to generate	skins	==== ;
; ====	on the fly based on the parameters provided it. The skin is quite bland, pulling	==== ;
; ====	slightly from Illustro for the 'theme', yet without any background images, instead	==== ;
; ====	simply using a transparent background. 												==== ;
; ============================================================================================== ;

[Metadata]
Name=CPU Generator
Description=Working example of a rainmeter skin generated via Lua. The measure captures your number of CPUs then creates a .ini with the appropriate number of measures. Finally it loads the newly generated .ini for use.
Version=1.0
Variant=1
Tags=Lua | CPU | Code Generator
Instructions=Run core.ini to initialize.  #cores.ini is the generated model appropriate for your machine

[Variables]
; partName is used to create the final name.  ini is to pass path to 
partName=cores.ini
ini=#CURRENTPATH#


[MeasureCPUCount]
; Get the number of CPUs so that the Lua script can properly generate code.
Measure=Registry
RegHKey=HKEY_LOCAL_MACHINE
RegKey=SYSTEM\CurrentControlSet\Control\Session Manager\Environment
RegValue=NUMBER_OF_PROCESSORS
; Update rate is completely pointless for this skin, it will only ever run once.
UpdateDivider=10000

[MeasureLuaScript]
Disabled=0
Measure=Script
ScriptFile=#CURRENTPATH#core.lua
setPath=#ini#
setName=#partName#
TableName=LuaCore
; See above regarding update.
UpdateDivider=10000

[MeterCPUBackground]
; The background is the same size as the Total Usage portion of the final skin... if it shows for 
; too long then the script is freezing.  It will also underlay the Header of the final Skin
; momentarily on first execution (since it has to refresh and find the new file.
Meter=IMAGE
X=1
Y=1
H=45
W=210
SolidColor=50,50,50,175

[MeterShowCPU]
; Identical 'title' to what will be generated by Lua for the new skin
Meter=STRING
Text="CPU"
X=100
Y=12
W=190
H=18
StringAlign=CENTER
StringStyle=Bold
FontColor=255,255,255,205
FontSize=8
FontFace=Trebuchet MS
AntiAlias=1

[MeterShowInitializing]
; Loader image while the script is generating the proper skin.  It should not appear for more
; than a few moments when skin is first loaded.
Meter=STRING
X=10
Y=25
W=1000
H=14
StringAlign=LEFT
StringStyle=Bold
FontColor=255,255,255,205
FontSize=8
FontFace=Trebuchet MS
AntiAlias=1
Text="Initializing..."

; For some reason it wouldn't accept Author in the original "rainmeter" section, RainBrowser
; appended it.
[Rainmeter]
Author=Zinsho | zinsho@gmail.com // edited by NisseDILLIGAF //
And the lua file...

core.lua

Code: Select all

--[[

	Author:		Zinsho
	Contact: 	zinsho@gmail.com
	Version:	1.00 (it's a working example, it performs as needed for that.
	
	Lua script to generate a CPU meter that scales to the system it is initially run on.
	
	This was partially to test my theory, and to teach myself the rudiments of Lua scripting and
	of Rainmeter skinning. 
	I'm quite certain there are several ways for this to be optimized, including using the
	[Variable] Section of the generated skin to reduce the length of the final skin. Additional
	tables, functions, variables and loops could also be used to remove lines from the various
	functions.
	
	I also suspect there is a more optimized way to write to the file rather than queueing up
	all the io.write() calls. 

--]]

PROPERTIES =
{
    setPath="";
    setPathSettings="";
    setName="";

}

function Initialize()

	-- Set local names for the variables and gain access to the # of cores.
    sSetName=PROPERTIES.setName
    sSetPath=PROPERTIES.setPath
    MeasureRead = SKIN:GetMeasure("MeasureCPUCount")

end -- function Initialize


function Update()

	
	-- Get # of cores from Rainmeter
    Cores=MeasureRead:GetStringValue()
	-- Create customized name based on number of cores.
    sSetName=Cores..sSetName
	-- Full name of the new skin, including path, to allow read and writes
	nSetPath=sSetPath..sSetName
    nSetPathSettings=sSetPath.."Settings.inc"
	-- Trims the path down to be what is required for activate config.
    sSetPath=sSetPath:match("Skins\\(.*)"):match("(.*)\\")
    --sSetPathSettings=sSetPathSettings:match("Skins\\(.*)"):match("(.*)\\")
	-- io.open loads the designated file, "w+" is write+update mode, previous data is erased.
	fsetPath = io.open(nSetPath,"w+")
    
    -- Generates Rainmeter Header for the new ini, including styles (for testing purposes)
    generateHeader()
	
    -- Generates the dynamic cpu cores
	for i=1,tonumber(Cores) do
		codeGenerator(i)
	end
    
	-- Write to the file then close it.
	fsetPath:flush()
	fsetPath:close()
    
    
    -- io.open loads the designated file, "w+" is write+update mode, previous data is erased.
	fsetPathSettings = io.open(nSetPathSettings,"w+")
	
    -- Generates Rainmeter Header for the new ini, including styles (for testing purposes)
    generateHeaderSettings()
    
    -- Generates the dynamic cpu cores
    for i=1,tonumber(Cores) do
		codeGeneratorSettings(i)
	end
    
	-- Write to the file then close it.
	fsetPathSettings:flush()
	fsetPathSettings:close()

	-- Force Rainmeter to update, revealing the new skin if the file had not existed.
	SKIN:Bang("!RainmeterRefreshApp")
	-- Activate the new skin, replacing the loader.
	SKIN:Bang("!RainmeterActivateConfig \""..sSetPath.."\" \""..sSetName.."\"")

end -- function Update

-- Required by Rainmeter, no purpose for this script.
function GetStringValue()

	return "Complete"

end -- function GetStringValue


-- Generates the Header of a Rainmeter skin, all data manually provided in this case.
function generateHeaderSettings()
    fsetPathSettings:write("[Variables]\n")
    fsetPathSettings:write("spacing=8\n")
    fsetPathSettings:write("size=150\n")
    fsetPathSettings:write("; Customizable values\n")
    fsetPathSettings:write("; Keep these colors opaque\n")
end -- function generateHeader


-- Generates the bulk of the skin, looping to provide the required CPU bars.
function codeGeneratorSettings(cpus)
    fsetPathSettings:write(";Core"..cpus.."\n")
    if cpus == 1 then
        fsetPathSettings:write("Color1=255, 0, 0\n")
    elseif cpus == 2 then
        fsetPathSettings:write("Color2=0, 0, 255\n")
    elseif cpus == 3 then
        fsetPathSettings:write("Color3=0, 255, 0\n")
    else
        fsetPathSettings:write("Color"..cpus.."=255, 255, 0\n")
    end
    fsetPathSettings:write("ColorAlt"..cpus.."=255, 255, 255\n")
    fsetPathSettings:write("ColorShadow"..cpus.."=0, 0, 0\n")
    fsetPathSettings:write("ShadowOffset"..cpus.."=2\n")
    fsetPathSettings:write("ShadowHide"..cpus.."=0\n")
    fsetPathSettings:write("ShadowHideAlt"..cpus.."=1\n")
    fsetPathSettings:write("ConfigHide"..cpus.."=1\n")
    fsetPathSettings:write("StartAngle"..cpus.."=1.555\n")
    fsetPathSettings:write("ArcLength"..cpus.."=7\n")
    fsetPathSettings:write("ArcOffset"..cpus.."=3\n")
    fsetPathSettings:write("PadRadius"..cpus.."=150\n")
    fsetPathSettings:write("OneArc"..cpus.."=0\n")
end -- function codeGeneratorSettings


-- Generates the Header of a Rainmeter skin, all data manually provided in this case.
function generateHeader()

	-- Generate Rainmeter
    fsetPath:write("[Rainmeter]\n")
    fsetPath:write("Update=50\n")
    fsetPath:write("Author=NisseDILLIGAF\n")
    fsetPath:write("AppVersion=2000000\n")
    fsetPath:write("OnRefreshAction=!Execute [!SnapEdges 1]")
    for i=1,tonumber(Cores) do
		fsetPath:write("[!SetVariable ArcLineLength"..i.." (#ArcStart"..i.."#+#ArcLength"..i.."#)]")
	end
    fsetPath:write("\n")
    fsetPath:write("\n")
	-- Generate Metadata
    fsetPath:write("[Metadata]\n")
    -- The metadata name matches the number of cores
    fsetPath:write("Name="..Cores.." core CPU display\n")
    fsetPath:write("Description=Dynamically generated Rainmeter skin via Lua\n")
    fsetPath:write("Version=1.00\n")
    fsetPath:write("\n")
	-- Included for completeness sake, did not store any variables for this test, probably can
	-- optimize if they are added.
    fsetPath:write("[Variables]\n")
    fsetPath:write("@include=#CURRENTPATH#Settings.inc\n")
    fsetPath:write("ArcStart1=#size#\n")
    fsetPath:write("ArcStart2=(#size#-#spacing#)\n")
    fsetPath:write("ArcStart3=(#size#-(#spacing#*2))\n")
    fsetPath:write("ArcStart4=(#size#-(#spacing#*3))\n")
    fsetPath:write("X1=0\n")
    fsetPath:write("Y1=0\n")
    fsetPath:write("W1=0\n")
    fsetPath:write("H1=0\n")
    fsetPath:write("X2=#spacing#\n")
    fsetPath:write("Y2=#spacing#\n")
    fsetPath:write("W2=0\n")
    fsetPath:write("H2=0\n")
    fsetPath:write("X3=(#spacing#*2)\n")
    fsetPath:write("Y3=(#spacing#*2)\n")
    fsetPath:write("W3=0\n")
    fsetPath:write("H3=0\n")
    fsetPath:write("X4=(#spacing#*3)\n")
    fsetPath:write("Y4=(#spacing#*3)\n")
    fsetPath:write("W4=0\n")
    fsetPath:write("H4=0\n")
    fsetPath:write("\n")
    fsetPath:write("\n")
	
end -- function generateHeader


-- Generates the bulk of the skin, looping to provide the required CPU bars.
function codeGenerator(cpus)

	-- Each CPU will be generated this way due to the FOR loop.
	
	-- Measure CPU#
    fsetPath:write("[MeasureCPU"..cpus.."]\n")
    fsetPath:write("Measure=CPU\n")
    fsetPath:write("Processor="..cpus.."\n")
    fsetPath:write("AverageSize=4\n")
    fsetPath:write("\n")
	
    fsetPath:write("[MeasureAngleCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("; A parabolic function is used to dampen low\n")
    fsetPath:write("; activity, making for a less annoying meter.\n")
    fsetPath:write("; It takes the form of f(x)=x^2.\n")
    fsetPath:write("Formula=(MeasureAngleCPU"..cpus.." + 0.01 + (MeasureCPU"..cpus.." * 0.01) ** 2) % 6.283\n")
    fsetPath:write("\n")

    fsetPath:write("[MeasureAngle1CPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=MeasureAngleCPU"..cpus.."\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureAngle2CPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=MeasureAngleCPU"..cpus.." + 3.14\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureArcCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=(MeasureCPU"..cpus.." * 0.003) ** 1.4 + 0.01\n")
    fsetPath:write("\n")
    
    fsetPath:write("; Functions to shift skin past edge of screen depending on #PadRadius# value.\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureXCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=ABS(SGN(#CURRENTCONFIGX#) - 1)\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("IfEqualValue=(#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfEqualAction=!SetVariable X"..cpus.." (#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfAboveValue=(#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfAboveAction=!SetVariable X"..cpus.." \"(#PadRadius"..cpus.."# - #ArcStart"..cpus.."# - #ArcOffset"..cpus.."# * 9 - #ArcLength"..cpus.."#) + (#spacing#*"..(cpus -1)..")\"\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureYCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=ABS(SGN(#CURRENTCONFIGY#) - 1)\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("IfEqualValue=(#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfEqualAction=!SetVariable Y"..cpus.." (#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfAboveValue=(#spacing#*"..(cpus -1)..")\n")
    fsetPath:write("IfAboveAction=!SetVariable Y"..cpus.." \"(#PadRadius"..cpus.."# - #ArcStart"..cpus.."# - #ArcOffset"..cpus.."# * 9 - #ArcLength"..cpus.."#) + (#spacing#*"..(cpus -1)..")\"\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureWCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=ABS(SGN(#SCREENAREAWIDTH# - #CURRENTCONFIGWIDTH# - #CURRENTCONFIGX#) - 1)\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("IfEqualValue=0\n")
    fsetPath:write("IfEqualAction=!SetVariable W"..cpus.." \"((#ArcStart"..cpus.."# + #ArcOffset"..cpus.."# * 9 + #ArcLength"..cpus.."#) * 2)\"\n")
    fsetPath:write("IfAboveValue=0\n")
    fsetPath:write("IfAboveAction=!SetVariable W"..cpus.." \"(((#ArcStart"..cpus.."# + #ArcOffset"..cpus.."# * 9 + #ArcLength"..cpus.."#) * 2 - #PadRadius"..cpus.."#) * 2)\"\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureHCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=ABS(SGN(#SCREENAREAHEIGHT# - #CURRENTCONFIGHEIGHT# - #CURRENTCONFIGY#) - 1)\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("IfEqualValue=0\n")
    fsetPath:write("IfEqualAction=!SetVariable H"..cpus.." \"((#ArcStart"..cpus.."# + #ArcOffset"..cpus.."# * 9 + #ArcLength"..cpus.."#) * 2)\"\n")
    fsetPath:write("IfAboveValue=0\n")
    fsetPath:write("IfAboveAction=!SetVariable H"..cpus.." \"(((#ArcStart"..cpus.."# + #ArcOffset"..cpus.."# * 9 + #ArcLength"..cpus.."#) * 2 - #PadRadius"..cpus.."#) * 2)\"\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureQuadrantCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("; (Top half of screen ? 0.5 : 0) + (odd quadrant = -1; even quadrant = 1) * 0.2 + 0.25\n")
    fsetPath:write("Formula=SGN(SGN(#SCREENAREAHEIGHT# / 2 - (#CURRENTCONFIGY# + #CURRENTCONFIGHEIGHT# / 2)) + 1) * 0.5 + (ABS(SGN((#CURRENTCONFIGX# + #CURRENTCONFIGWIDTH# / 2) - #SCREENAREAWIDTH# / 2) + SGN((#CURRENTCONFIGY# + #CURRENTCONFIGHEIGHT# / 2) - #SCREENAREAHEIGHT# / 2)) - 1) * 0.2 + 0.25\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("Disabled=#ConfigHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureXPosCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("; Returns 0 for left half of screen, 1 for right half\n")
    fsetPath:write("Formula=((#CURRENTCONFIGX# * 2 + #CURRENTCONFIGWIDTH#) - #SCREENAREAWIDTH#) < 0 ? 0 : 1\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("Disabled=#ConfigHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureYPosCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("; Returns 0 for top half of screen, 1 for bottom half\n")
    fsetPath:write("Formula=((#CURRENTCONFIGY# * 2 + #CURRENTCONFIGHEIGHT#) - #SCREENAREAHEIGHT#) < 0 ? 0 : 1\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("Disabled=#ConfigHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeasureCircleCPU"..cpus.."]\n")
    fsetPath:write("Measure=CALC\n")
    fsetPath:write("Formula=1\n")
    fsetPath:write("UpdateDivider=-1\n")
    fsetPath:write("\n")
    
    fsetPath:write("; ----------------STYLES----------------\n")
    fsetPath:write("\n")
    
    fsetPath:write("[StyleArcCPU"..cpus.."]\n")
    fsetPath:write("MeasureName=MeasureArcCPU"..cpus.."\n")
    fsetPath:write("X=#X"..cpus.."#\n")
    fsetPath:write("Y=#Y"..cpus.."#\n")
    fsetPath:write("W=#W"..cpus.."#\n")
    fsetPath:write("H=#H"..cpus.."#\n")
    fsetPath:write("LineStart=#ArcStart"..cpus.."#\n")
    fsetPath:write("LineLength=#ArcLineLength"..cpus.."#\n")
    fsetPath:write("LineColor=#Color"..cpus.."#\n")
    fsetPath:write("AntiAlias=1\n")
    fsetPath:write("Solid=1\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("\n")
    
    fsetPath:write("[StyleShadowCPU"..cpus.."]\n")
    fsetPath:write("X=(#X"..cpus.."# + #ShadowOffset"..cpus.."#)\n")
    fsetPath:write("Y=(#Y"..cpus.."# + #ShadowOffset"..cpus.."#)\n")
    fsetPath:write("LineColor=#ColorShadow"..cpus.."#, 64\n")
    fsetPath:write("Hidden=#ShadowHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[StyleConfigCPU"..cpus.."]\n")
    fsetPath:write("X=#X"..cpus.."#\n")
    fsetPath:write("Y=#Y"..cpus.."#\n")
    fsetPath:write("W=#W"..cpus.."#\n")
    fsetPath:write("H=#H"..cpus.."#\n")
    fsetPath:write("AntiAlias=1\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("Hidden=#ConfigHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[StyleConfigLabelCPU"..cpus.."]\n")
    fsetPath:write("SolidColor=0, 0, 0\n")
    fsetPath:write("FontColor=255, 255, 255\n")
    fsetPath:write("FontSize=10\n")
    fsetPath:write("FontFace=Arial\n")
    fsetPath:write("StringStyle=BOLD\n")
    fsetPath:write("AntiAlias=1\n")
    fsetPath:write("DynamicVariables=1\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("Hidden=#ConfigHide"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("; ----------------METERS----------------\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeterClickCPU"..cpus.."]\n")
    fsetPath:write("Meter=ROUNDLINE\n")
    fsetPath:write("MeterStyle=StyleArcCPU"..cpus.."\n")
    fsetPath:write("MeasureName=MeasureCircleCPU"..cpus.."\n")
    fsetPath:write("LineColor=#Color"..cpus.."#, 20\n")
    fsetPath:write("AntiAlias=0\n")
    fsetPath:write("UpdateDivider=20\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeterArc1ShadowCPU"..cpus.."]\n")
    fsetPath:write("Meter=ROUNDLINE\n")
    fsetPath:write("MeterStyle=StyleArcCPU"..cpus.." | StyleShadowCPU"..cpus.."\n")
    fsetPath:write("StartAngle=[MeasureAngle1CPU"..cpus.."]\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeterArc2ShadowCPU"..cpus.."]\n")
    fsetPath:write("Meter=ROUNDLINE\n")
    fsetPath:write("MeterStyle=StyleArcCPU"..cpus.." | StyleShadowCPU"..cpus.."\n")
    fsetPath:write("StartAngle=[MeasureAngle2CPU"..cpus.."]\n")
    fsetPath:write("Hidden=#OneArc"..cpus.."#\n")
    fsetPath:write("\n")
    
    fsetPath:write("[MeterArc1CPU"..cpus.."]\n")
    fsetPath:write("Meter=ROUNDLINE\n")
    fsetPath:write("MeterStyle=StyleArcCPU"..cpus.."\n")
    fsetPath:write("StartAngle=[MeasureAngle1CPU"..cpus.."]\n")
    fsetPath:write("\n")

    fsetPath:write("[MeterArc2CPU"..cpus.."]\n")
    fsetPath:write("Meter=ROUNDLINE\n")
    fsetPath:write("MeterStyle=StyleArcCPU"..cpus.."\n")
    fsetPath:write("StartAngle=[MeasureAngle2CPU"..cpus.."]\n")
    fsetPath:write("Hidden=#OneArc"..cpus.."#\n")
    fsetPath:write("\n")
    
end -- function GetStringValue
Hope u like it :)