ScriptSpot

Script

objectPicker

By stefangura · 2020-02-06

Version
1.3
Version requirement
minimum compatible versio 3ds Max 2016
Date updated
2020-02-06
Votes
4
Description


try(DestroyDialog OP_EDITOR) catch()
rollout OP_EDITOR "ObjectPicker" width:240 height:550
(
global fileX = #()
global bgPath
global OP
global OPTimer
global OPselection = #()
global OPselectionIND = #()
global OPstartPos = [0.0,0.0]
global anyButton = undefined
global OPmouseCurs = dotnetclass "System.Windows.Forms.Cursor"
global OPkoef = 1.0
--------------------------------------------forMove
global OP_p
global OP_move = false
global OPCtrlSave = #()
global OPposSave = #()
--------------------------------------------forUndo
global OP_UNDO = #()
global OP_UNDOcount = 20
---------------------------------------------------------EVENTS
fn OPresize win arg=
(
local koef = (win.MaxHeight*0.1)/(win.MaxWidth*0.1)
win.Height =win.Width*koef
OPkoef = win.Height/(win.MaxHeight*0.1)
win.content.children.item[0].Width = (win.MaxWidth*0.1)*OPkoef
win.content.children.item[0].Height = (win.MaxHeight*0.1)*OPkoef
win.content.children.item[0].Margin = dotNetObject "System.Windows.Thickness" (win.Width *-0.5) (win.Height*-0.5) 0 0
for i = 2 to win.content.children.count do
(
local bntOne = win.content.children.item[i-1].children.item[0]
bntOne.Width = fileX[i][3]*OPkoef
bntOne.Height = fileX[i][4]*OPkoef
try
(
if bntOne.radiusX != 0.0 then
(
bntOne.radiusX = (amin #( bntOne.Width, bntOne.Height)) * 0.3
bntOne.radiusY= (amin #( bntOne.Width, bntOne.Height)) * 0.3
)
)catch()
bntOne.Margin = dotNetObject "System.Windows.Thickness" (-bntOne.Width*0.5) (-bntOne.Height*0.5) 0 0
win.content.children.item[i-1].Margin = dotNetObject "System.Windows.Thickness" (fileX[i][1]*OPkoef) (fileX[i][2]*OPkoef) 0 0
bntOne = win.content.children.item[i-1].children.item[1]
bntOne.FontSize = fileX[i][12][3]*OPkoef
bntOne.Margin = dotNetObject "System.Windows.Thickness" ((bntOne.ActualWidth * -0.5) + fileX[i][12][4]*OPkoef ) ((bntOne.ActualHeight * -0.5) + fileX[i][12][5]*OPkoef) 0 0
)
)
fn OPClose win arg=
(
OPselection = #()
OPselectionIND = #()
OPTimer.Dispose()
fileX = #()
)
fn clickBg =
(-------------------------------CLICK start
OPstartPos = OPmouseCurs.Position
anyButton = #()
for i = 2 to op.content.children.count do
(--traf??????
if (op.content.children.item[i-1].children.item[0].IsMouseOver == true) do
(
anyButton = #(op.content.children.item[i-1].children.item[0], i)
)
)
-----------------------------------------------------------------------------------------------------------------
if anyButton.count != 0 then
(--ak ANO
if (keyboard.AltPressed) or (keyboard.controlPressed) then
(
if (keyboard.AltPressed) then
(
local found = (findItem OPselection anyButton[1])
if (found != 0) then
(
try
(
deleteItem OPselection found
deleteItem OPselectionIND found
)catch()
) else()
)
if (keyboard.controlPressed) then
(
appendifUnique OPselection anyButton[1]
appendifUnique OPselectionIND anyButton[2]
)
)else
(
OPselection = #(anyButton[1])
OPselectionIND = #(anyButton[2])
)
)else
(--ak NIE
if (keyboard.controlPressed) then () else
(
OPselection=#()
OPselectionIND = #()
)
)
-----------------------------------------------------------------------------------------------------------------Fsetko Bez Okrajov potom Selekcia s Okrajmi
for j= 1 to (op.content.children.count-1) do
(
op.content.children.item[j].children.item[0].StrokeThickness =0
)
for j= 1 to OPselection.count do
(
OPselection[j].StrokeThickness = 3
)
-----------------------------------------------------------------------------------------------
if (OP_EDITOR.editBTN.checked != true) then
(
-----------------------------------------------------------------------------------------------selection
deselect objects
local newSel = #()
for k = 1 to OPselection.count do
(
for j in fileX[OPselectionIND[k]][7] do
(
if ((getnodebyname j) != undefined) do (append newSel (getnodebyname j))
)
)
try (select newSel) catch()
-----------------------------------------------------------------------------------------------move
if OP_EDITOR.chbM.checked then
(
OP_move = false
OPCtrlSave = #()
OPposSave = #()
for i = 1 to OPselection.count do
(
OPCtrlSave[i] = #()
OPposSave[i] = #()
for j = 1 to fileX[OPselectionIND[i]][7].count do
(
try
(
OPCtrlSave[i][j] = #()
OPposSave[i][j] = #()
OPCtrlSave[i][j][1] = execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][8])
OPCtrlSave[i][j][2] = execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][10])
OPposSave[i][j][1] = (OPCtrlSave[i][j][1]).value
OPposSave[i][j][2] = (OPCtrlSave[i][j][2]).value
)catch()
)
)
)
)
OPTimer.start()
)
fn moveBTN =
(-------------------------------CLICK hold
OP_p = OPmouseCurs.Position
if (OP_EDITOR.editBTN.checked) then
(--if EditMode
for i = 1 to OPselection.count do
(
local newX = fileX[OPselectionIND[i]][1] * OPkoef + (OP_p.x - OPstartPos.x)
local newY = fileX[OPselectionIND[i]][2] * OPkoef + (OP_p.y - OPstartPos.y)
OPselection[i].parent.margin = dotNetObject "System.Windows.Thickness" newX newY 0 0
)
)else
(--if no EditMode
if OP_EDITOR.chbM.checked then
(--if no EditMode and "MOVE" ON
OP_move = true
for i = 1 to OPselection.count do
(
for j = 1 to fileX[OPselectionIND[i]][7].count do
(
try
(
OPCtrlSave[i][j][1].value = OPposSave[i][j][1] + (OP_p.x - OPstartPos.x) * fileX[OPselectionIND[i]][9]
OPCtrlSave[i][j][2].value = OPposSave[i][j][2] + (OP_p.y - OPstartPos.y) * fileX[OPselectionIND[i]][11]
)catch()
)
)
)
)
)
fn upBg =
(-------------------------------CLICK end
OPTimer.Stop()
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][1] = ( OPselection[i].parent.margin.Left / OPkoef )
fileX[OPselectionIND[i]][2] = ( OPselection[i].parent.margin.Top / OPkoef )
)
if (OP_EDITOR.chbM.checked and OP_move) then
(--if no EditMode and "MOVE" ON
for i = 1 to OPselection.count do
(
for j = 1 to fileX[OPselectionIND[i]][7].count do
(
try
(
insertItem #(OPCtrlSave, OPposSave) OP_UNDO 1
)catch()
OP_UNDO.count = OP_UNDOcount
)
)
)
)
fn clickBtn btn arg=
(
if (OP_EDITOR.editBTN.checked) then
(
OP_EDITOR.sp01.value = btn.Width / OPkoef
OP_EDITOR.sp02.value = btn.Height / OPkoef
OP_EDITOR.cp.color = (color btn.Fill.Color.r btn.Fill.Color.g btn.Fill.Color.b btn.Fill.Color.a)
local found = undefined
for i = 1 to (btn.parent.parent.children.count-1) do
(
if (btn.parent == btn.parent.parent.children.item[i]) do (found = i)
)
OP_EDITOR.et01.text = fileX[found+1][8]
OP_EDITOR.sp03.value = fileX[found+1][9]
OP_EDITOR.et02.text = fileX[found+1][10]
OP_EDITOR.sp04.value = fileX[found+1][11]
OP_EDITOR.etbtn.text = fileX[found+1][12][1]
OP_EDITOR.cpTxt.color = fileX[found+1][12][2]
OP_EDITOR.spBtn01.value = fileX[found+1][12][3]
OP_EDITOR.spBtn02.value = fileX[found+1][12][4]
OP_EDITOR.spBtn03.value = fileX[found+1][12][5]
)else()
)
----------------------------------------------------------functions
fn OPcreateWin bgPath=
(
local tokens = filterString bgPath "\\"
fileX[1] = ""
for i in tokens do (fileX[1] = fileX[1] + i + "\\\\")
fileX[1] = replace fileX[1] (fileX[1].count-1) 2 ""
------------------------------------------------------------------------------------------------------------------------------ImageSource
ImageSource = dotnetobject "System.Windows.Media.Imaging.BitmapImage"
ImageSource.BeginInit()
ImageSource.UriSource = dotnetobject "System.uri" bgPath
ImageSource.EndInit()
------------------------------------------------------------------------------------------------------------------------------bgRec
bg = dotnetobject "System.Windows.Shapes.rectangle"
bg.Width = ImageSource.PixelWidth
bg.Height = ImageSource.PixelHeight
bg.Fill = dotnetobject "System.Windows.Media.ImageBrush"
bg.Fill.ImageSource = ImageSource
------------------------------------------------------------------------------------------------------------------------------mainWin
op = dotnetobject "System.Windows.Window"
op.Width = ImageSource.PixelWidth
op.Height = ImageSource.PixelHeight
op.MaxWidth =10.0*op.Width
op.MaxHeight = 10.0*op.Height
op.WindowStyle = op.WindowStyle.SingleBorderWindow
wih = dotnetobject "System.Windows.Interop.WindowInteropHelper" op
wih.owner = dotnetobject "IntPtr" (windows.getmaxhwnd())
op.Show()
------------------------------------------------------------------------------------------------------------------------------Canvas
cv = dotnetobject "System.Windows.Controls.Canvas"
cv.Width = 1
cv.Height = 1
op.content = cv
cv.Children.Add bg
bg.Margin = dotNetObject "System.Windows.Thickness" (op.Width *-0.5) (op.Height*-0.5) 0 0
------------------------------------------------------------------------------------------------------------------------------Timer
opTimer = dotnetobject "System.Windows.Forms.Timer"
opTimer.Interval = 50
dotnet.removeAllEventHandlers opTimer
dotnet.addEventHandler opTimer "Tick" moveBTN

dotNet.removeAllEventHandlers op
dotNet.addEventHandler op "SizeChanged" OPresize
dotNet.addEventHandler op "Closed" OPClose
dotNet.addEventHandler op "MouseDown" clickBg
dotNet.addEventHandler op "MouseUp" upBg
)
fn OPaddBtn data win =
(
if data == undefined then
(
data = #(0,0,OP_EDITOR.sp01.value,OP_EDITOR.sp02.value,(OP_EDITOR.cp.color),(OP_EDITOR.ddl.selected),#(),OP_EDITOR.et01.text,OP_EDITOR.sp03.value,OP_EDITOR.et02.text,OP_EDITOR.sp04.value,#( OP_EDITOR.etbtn.text, OP_EDITOR.cpTxt.color, OP_EDITOR.spBtn01.value, OP_EDITOR.spBtn02.value, OP_EDITOR.spBtn03.value))
)
local btn
if (data[6] == "box") do (btn = dotnetobject "System.Windows.Shapes.Rectangle")
if (data[6] == "circle") do (btn = dotnetobject "System.Windows.Shapes.Ellipse")
if (data[6] == "round") do
(
btn = dotnetobject "System.Windows.Shapes.Rectangle"
btn.radiusX = (amin #( (data[3]*OPkoef), (data[4]*OPkoef))) * 0.3
btn.radiusY= (amin #( (data[3]*OPkoef), (data[4]*OPkoef))) * 0.3
)
btn.Width = data[3]*OPkoef
btn.Height = data[4]*OPkoef
btn.Stroke = dotnetobject "System.Windows.Media.SolidColorBrush"
btn.Stroke.Color = btn.Stroke.Color.FromArgb 255 255 255 255
btn.StrokeThickness = 0
btn.Fill = dotnetobject "System.Windows.Media.SolidColorBrush"
btn.Fill.Color = btn.Fill.Color.FromArgb (data[5].a) (data[5].r) (data[5].g) (data[5].b)
btn.margin = dotNetObject "System.Windows.Thickness" (btn.Width*-0.5) (btn.Height*-0.5) 0 0
local newCanvasNum = op.content.Children.Add (dotNetObject "System.Windows.Controls.Canvas")
win.content.Children.item[newCanvasNum].margin = dotNetObject "System.Windows.Thickness" data[1] data[2] 0 0
win.content.Children.item[newCanvasNum].Children.add btn
dotNet.removeAllEventHandlers btn
dotNet.addEventHandler btn "MouseDown" clickBTN
dotNet.setLifetimeControl btn #dotnet
--text
local txt = dotNetObject "System.Windows.Controls.TextBlock"
txt.IsHitTestVisible = false
txt.Text = data[12][1]
txt.Foreground = dotnetobject "System.Windows.Media.SolidColorBrush"
txt.Foreground.Color = txt.Foreground.Color.FromArgb (255) (data[12][2].r) (data[12][2].g) (data[12][2].b)
txt.FontSize = data[12][3]*OPkoef
win.content.Children.item[newCanvasNum].Children.add txt
dotNet.setLifetimeControl txt #dotnet
txt.margin = dotNetObject "System.Windows.Thickness" ((txt.ActualWidth * -0.5) + data[12][4]*OPkoef ) ((txt.ActualHeight * -0.5) + data[12][5]*OPkoef) 0 0
)
button selectBG "Image" pos:[0,0] width:((OP_EDITOR.width/3.0)*2) height:30 toolTip:"Select image for window background"
button ScreenBG "Screen" pos:[(OP_EDITOR.width/3.0)*2,0] width:(OP_EDITOR.width/3.0) height:30 toolTip:"Get and save viewport and use it as bacground"
checkbutton editBTN "EDIT" pos:[0,30] width:(OP_EDITOR.width) height:50 checked:true toolTip:"editMode ON"
button addBtn "ADD" pos:[0,80] width:((OP_EDITOR.width/3.0)*2) height:50 toolTip:"add button"
button remBtn "REM" pos:[(OP_EDITOR.width/3.0)*2,80] width:(OP_EDITOR.width/3.0) height:50 toolTip:"remove button"
button setSel "SetSel" pos:[0,130] width:(OP_EDITOR.width) height:40 toolTip:"Set object selection as selection for picker button"
colorpicker cp pos:[-2,170] width:(OP_EDITOR.width) height:30 alpha:true
dropdownlist ddl "" pos:[0,200] width:(OP_EDITOR.width) items:#("box", "circle","round")
spinner sp01 "btnW" pos:[10,225] range:[10,2000,50] type:#integer
spinner sp02 "btnH" pos:[13,245] range:[10,2000,50] type:#integer
button btnSend "sendBack" pos:[OP_EDITOR.width*.65,225] width:(OP_EDITOR.width*.3) height:35 toolTip:"send Buttons into back"
edittext etbtn "Name" pos:[5,270] width:(OP_EDITOR.width*0.7) text:"" --height:18
colorpicker cpTxt pos:[OP_EDITOR.width*0.73,270] width:(OP_EDITOR.width*0.25) height:20 alpha:false color:(color 255 255 255)
spinner spBtn01 "" pos:[5,300] range:[5,200,25] type:#integer width:(OP_EDITOR.width*0.3)
spinner spBtn02 "" pos:[OP_EDITOR.width*0.3+10,300] range:[-2000,2000,0] type:#integer width:(OP_EDITOR.width*0.3)
spinner spBtn03 "" pos:[OP_EDITOR.width*0.6+15,300] range:[-2000,2000,0] type:#integer width:(OP_EDITOR.width*0.3)
checkbox chbM "Select&Move" pos:[10,OP_EDITOR.height - 200]
button btnUndo "undo" pos:[OP_EDITOR.width/2,OP_EDITOR.height - 205] width:(OP_EDITOR.width/2) height:30 --visible:false
edittext et01 "Xpression" pos:[5,OP_EDITOR.height - 165] width:(OP_EDITOR.width-90) height:20 labelOnTop:true text:".pos.controller.X_Position.controller" visible:false
label l01 "koefX:" pos:[OP_EDITOR.width-75,OP_EDITOR.height - 165] visible:false
spinner sp03 "" pos:[OP_EDITOR.width-75,OP_EDITOR.height - 145] range:[-2000,2000,0.2] type:#float labelOnTop:true width:70 visible:false
edittext et02 "Ypression" pos:[5,OP_EDITOR.height - 120] width:(OP_EDITOR.width-90) height:20 labelOnTop:true text:".pos.controller.Z_Position.controller" visible:false
label l02 "koefY:" pos:[OP_EDITOR.width-75,OP_EDITOR.height - 120] visible:false
spinner sp04 "" pos:[OP_EDITOR.width-75,OP_EDITOR.height - 100] range:[-2000,2000,-0.2] type:#float labelOnTop:true width:70 visible:false
button testX "test expressions" pos:[0,(OP_EDITOR.height - 80)] width:(OP_EDITOR.width) height:30 visible:false
button saveX "save" pos:[0,(OP_EDITOR.height - 50)] width:(OP_EDITOR.width*0.5) height:50
button loadX "load" pos:[(OP_EDITOR.width *0.5),(OP_EDITOR.height - 50)] width:(OP_EDITOR.width*0.5) height:50
on OP_EDITOR open do
(--on open
options.PrintAllElements = true
try (op.close())catch()
op = undefined
)
on OP_EDITOR close do
(--on close

)
on selectBG pressed do
(--use image as bg
bgPath = getOpenFileName()
if bgPath != undefined then (OPcreateWin bgPath)else()
)
on ScreenBG pressed do
(--create screen capture as bg
OPscreen = gw.getViewportDib gammaCorrect:true
OPscreen.filename = getSaveFileName types:"imageFormats(*.jpg)|*.jpg"
if OPscreen.filename != "" then
(
save OPscreen
bgPath = OPscreen.filename
OPcreateWin bgPath
)
close OPscreen
)
on editBTN changed state do
(--edit mode on
addBtn.visible = state
remBtn.visible = state
cp.visible = state
ddl.visible = state
sp01.visible = state
sp02.visible = state
btnSend.visible = state
etbtn.visible = state
cpTxt.visible = state
spBtn01.visible = state
spBtn02.visible = state
spBtn03.visible = state
setSel.visible = state
if chbM.state == true then
(
et01.visible = state
l01.visible = state
sp03.visible = state
et02.visible = state
l02.visible = state
sp04.visible = state
testX.visible = state
)
)
on addBtn pressed do
(--add button
if op != undefined then
(
OPaddBtn undefined op
append fileX #(0,0,sp01.value/OPkoef,sp02.value/OPkoef,(OP_EDITOR.cp.color),(OP_EDITOR.ddl.selected),#(),(OP_EDITOR.et01.text),(OP_EDITOR.sp03.value),(OP_EDITOR.et02.text),(OP_EDITOR.sp04.value),#((OP_EDITOR.etbtn.text), (OP_EDITOR.cptxt.color), (OP_EDITOR.spBtn01.value/OPkoef), (OP_EDITOR.spBtn02.value/OPkoef), (OP_EDITOR.spBtn03.value/OPkoef)))
)else()
)
on remBtn pressed do
(--delete button
if (OP_EDITOR.editBTN.checked) then
(
OPselectionIND = sort OPselectionIND
for i in OPselection do (OPselection[1].parent.parent.children.remove OPselection[1].parent)
for i = OPselectionIND.count to 1 by -1 do
(
deleteItem fileX OPselectionIND[i]
)
)
)
on cp changed c do
(--button color
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
OPselection[i].fill.color= (dotNetClass "System.Windows.Media.Color").fromARGB c.a c.r c.g c.b
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][5]=c
)
)
)
)
on ddl selected shape do
(--button shape
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
local btn
local parentX = OPselection[i].parent
local txt = dotNetObject "System.Windows.Controls.TextBlock"
if (ddl.items[shape] == "box") do
(
btn = dotnetobject "System.Windows.Shapes.Rectangle"
)
if (ddl.items[shape] == "circle") do
(
btn = dotnetobject "System.Windows.Shapes.Ellipse"
)
if (ddl.items[shape] == "round") do
(
btn = dotnetobject "System.Windows.Shapes.Rectangle"
btn.radiusX = (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
btn.radiusY= (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
)
btn.Width = OPselection[i].Width
btn.Height = OPselection[i].Height
btn.Stroke = OPselection[i].Stroke
btn.StrokeThickness = OPselection[i].StrokeThickness
btn.Fill = OPselection[i].Fill
btn.margin = OPselection[i].margin
dotNet.removeAllEventHandlers OPselection[i]
dotNet.addEventHandler btn "MouseDown" clickBTN
txt.IsHitTestVisible = false
txt.Text = parentX.children.item[1].Text
txt.Foreground = parentX.children.item[1].Foreground
txt.FontSize = parentX.children.item[1].FontSize
txt.margin = parentX.children.item[1].margin
parentX.children.add btn
parentX.children.add txt
parentX.children.Remove parentX.children.item[0]
parentX.children.Remove parentX.children.item[0]
OPselection[i] = parentX.children.item[0]
fileX[OPselectionIND[i]][6] = ddl.items[shape]
)
)
)
on sp01 changed val do
(--button sizeX
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
OPselection[i].Width = val * OPkoef
OPselection[i].margin = dotNetObject "System.Windows.Thickness" (-OPselection[i].Width * 0.5) (-OPselection[i].Height* 0.5) 0 0
fileX[OPselectionIND[i]][3]= val
try
(
if OPselection[i].radiusX != 0.0 then
(
OPselection[i].radiusX = (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
OPselection[i].radiusY= (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
)
)catch()
)
)
)
on sp02 changed val do
(--button sizeY
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
OPselection[i].Height = val * OPkoef
OPselection[i].margin = dotNetObject "System.Windows.Thickness" (-OPselection[i].Width* 0.5) (-OPselection[i].Height * 0.5) 0 0
fileX[OPselectionIND[i]][4]=val
try
(
if OPselection[i].radiusX != 0.0 then
(
OPselection[i].radiusX = (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
OPselection[i].radiusY= (amin #(OPselection[i].Width, OPselection[i].height)) * 0.3
)
)catch()
)
)
)
on btnSend pressed do
(------------------------------------------------------
try
(
local arrN = #()
local fileXN = #()
-------------------------------------------------------------create arr of all buttons
append arrN (copy op.content.children.item[0])
append fileXN fileX[1]
-------------------------------------------from arr take selected buttons into arrN
for i = 1 to OPselectionIND.count do
(
append arrN (copy op.content.children.item[OPselectionIND[i]-1])
append fileXN fileX[OPselectionIND[i]]
)
sort OPselectionIND
-----------------------------------------------------from arr delete selected buttons
for i = OPselectionIND.count to 1 by-1 do
(
op.content.children.RemoveAt(OPselectionIND[i]-1)
deleteItem fileX (OPselectionIND[i])
)
-------------------------------------------------------------------all but 1 from fileX
for i = 2 to op.content.children.count do
(
append arrN (copy op.content.children.item[i-1])
append fileXN fileX[i]
)
for i = 2 to op.content.children.count do
(
op.content.children.RemoveAt(1)
deleteItem fileX 2
)
op.content.children.clear()
for i = 1 to arrN.count do
(
op.content.children.add arrN[i]
)
fileX = deepCopy fileXN
free arrN
free fileXN
)catch()
)
on etbtn changed val do
(--button name
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
local bntOne = OPselection[i].parent.children.item[1]
bntOne.Text = val
bntOne.Margin = dotNetObject "System.Windows.Thickness" ((bntOne.ActualWidth * -0.5) + OP_EDITOR.spBtn02.value * OPkoef ) ((bntOne.ActualHeight * -0.5) + OP_EDITOR.spBtn03.value*OPkoef) 0 0
fileX[OPselectionIND[i]][12][1]=val
)
)
)
on cpTxt changed c do
(--text color
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
OPselection[i].parent.children.item[1].Foreground.Color = (dotNetClass "System.Windows.Media.Color").fromARGB 255 c.r c.g c.b

for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][12][2]=c
)
)
)
)
on spBtn01 changed val do
(--button text fontsize
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
local bntOne = OPselection[i].parent.children.item[1]
bntOne.FontSize = val*OPkoef
bntOne.Margin = dotNetObject "System.Windows.Thickness" ((bntOne.ActualWidth * -0.5) + fileX[OPselectionIND[i]][12][4] * OPkoef ) ((bntOne.ActualHeight * -0.5) + fileX[OPselectionIND[i]][12][5] * OPkoef) 0 0
fileX[OPselectionIND[i]][12][3]=val
)
)
)
on spBtn02 changed val do
(--button text margin x
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
local bntOne = OPselection[i].parent.children.item[1]
bntOne.Margin = dotNetObject "System.Windows.Thickness" ((bntOne.ActualWidth * -0.5) + val * OPkoef ) ((bntOne.ActualHeight * -0.5) + OP_EDITOR.spBtn03.value*OPkoef) 0 0
--OPselection[i].parent.children.item[1].margin = dotNetObject "System.Windows.Thickness" (val * OPkoef) (OP_EDITOR.spBtn03.value * OPkoef) 0 0
fileX[OPselectionIND[i]][12][4]= val
)
)
)
on spBtn03 changed val do
(--button text margin y
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
local bntOne = OPselection[i].parent.children.item[1]
bntOne.Margin = dotNetObject "System.Windows.Thickness" ((bntOne.ActualWidth * -0.5) + OP_EDITOR.spBtn02.value * OPkoef ) ((bntOne.ActualHeight * -0.5) + val*OPkoef) 0 0
--OPselection[i].parent.children.item[1].margin = dotNetObject "System.Windows.Thickness" (OP_EDITOR.spBtn02.value * OPkoef) ( val * OPkoef) 0 0
fileX[OPselectionIND[i]][12][5]= val
)
)
)
on chbM changed theState do
(--show/Hide for move
--btnUndo.visible = theState
if editBTN.state ==true then
(
et01.visible = theState
et02.visible = theState
sp03.visible = theState
sp04.visible = theState
l01.visible = theState
l02.visible = theState
testX.visible = theState
)
)
on btnUndo pressed do
(--try Undo changes
try
(
for i = 1 to OPselection.count do
(
for j = 1 to fileX[OPselectionIND[i]][7].count do
(
OP_UNDO[1][1][i][j][1].value = OP_UNDO[1][2][i][j][1]
OP_UNDO[1][1][i][j][2].value = OP_UNDO[1][2][i][j][2]
)
)
deleteItem OP_UNDO 1
)catch()
)
on setSel pressed do
(--SetSelection
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][7] = for i in Selection collect i.name
)
)
)
on et01 changed txt do
(--button XpressionX
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][8]= txt
)
)
)
on sp03 changed val do
(--move koeficient X
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][9]= val
)
)
)
on et02 changed txt do
(--button XpressionY
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][10]= txt
)
)
)
on sp04 changed val do
(--move koeficient Y
if (OP_EDITOR.editBTN.checked) then
(
for i = 1 to OPselection.count do
(
fileX[OPselectionIND[i]][11]= val
)
)
)
on testX pressed do
(--try test and add controller to selected objects
for i = 1 to OPselection.count do
(
for j = 1 to fileX[OPselectionIND[i]][7].count do
(
try
(
if (execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][8]))==undefined then
(
try (execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][8] + "= Bezier_Float()"))catch(messageBox "problemCreatingXController")
)
)catch(messageBox "problemX")
try
(
if (execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][10]))==undefined then
(
try (execute ("$" + fileX[OPselectionIND[i]][7][j] + fileX[OPselectionIND[i]][10] + "= Bezier_Float()"))catch(messageBox "problemCreatingYController")
)
)catch(messageBox "problemY")
)
)
)
on saveX pressed do
(--save fileX
out_name = getSaveFileName()
if (out_name != undefined) then
(
out_file = createfile out_name
print fileX to:out_file
close out_file
)
)
on loadX pressed do
(--load fileX and create win
try
(
fileX = #()
fs = openFile (getOpenFileName())
while not eof fs do
(
append fileX (execute (readline fs))
)
close fs
OPcreateWin fileX[1]
OPkoef = 1.0
for i = 2 to fileX.count do
(
OPaddBtn fileX[i] op
)
op.height = op.height-1
)catch()
)
)
createdialog OP_EDITOR
--minimize OP window
--resize just after load to update text size and pos
--use lesser value from height or width for round edges and roundness set on 0.3
--bigger ADD and REM
--correct send back in multisellect

Additional Info

basic script for creating object picker UI.
Videos