deargui-vpl/ref/virtools/Samples/ExportPlugins/3dsMax Export/CKInstScripts/VirtoolsUtility.ms

733 lines
27 KiB
Plaintext

-------------------------------------------------------------------------------
-- AttachScriptOnThis( ScriptName )
-- AttachScriptOnCharacter( ScriptName )
-- SetParamOnThis( ParamName, ParamVal
-- SetParam( MaxObjName, ParamName, ParamValue )
-- SetAttributeOnThis( AttName, AttValue, AttType, AttCatego )
-- SetAttributeOnCharacter( AttName, AttValue, AttType, AttCatego )
-- Load( fileName )
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Global Variables
-------------------------------------------------------------------------------
global exportFct, previewFct, quickPreviewFct, updateInstructionsList, registerInstruction
global AddCKChunk, RemoveCKChunk, WriteConfig, ReadConfig, GetLevelObject
global Virtools_Preview, VirtoolsExportOpt, VirtoolsExportProcess, VirtoolsInstructionsManager
global posAsVirtools, boolAsVirtools, matrixInParentAsVirtools
global ReadCKBufValue, ReadCKBufValueAsFloat, ReadCKBufValueAsInt, ReadCKBufValueAsVector
global ReadCKBufValueAsAngle, ReadCKBufValueAsTime
global maxPath = getdir #maxroot
global virtoolsAddonsPath = maxPath + "plugins\\Virtools AddOns\\"
global CKInstPath = maxPath + "scripts\\CKInstScripts\\"
global previewFileName = virtoolsAddonsPath + "preview.vmo"
global configFileName = (getdir #plugcfg) + "\\Max2Nmo.CFG"
global configSettingSection = "Settings"
if VirtoolsWindow!=undefined do (
closerolloutfloater VirtoolsWindow
)
global VirtoolsWindow
global currentRollout = unsupplied
global CKCHUNKBEGINSTR = "CKCHUNK_BEGIN"
global CKCHUNKENDSTR = "CKCHUNK_END"
global CKAttacheScriptOnThisStr = "CK_AttachScriptOnThis"
global CKAttachScriptOnCharacterStr = "CK_AttachScriptOnCharacter"
global CKSetParamOnThisStr = "CK_SetParamOnThis"
global CKSetParamStr = "CK_SetParam"
global CKSetAttributeOnThisStr = "CK_SetAttributeOnThis"
global CKSetAttributeOnCharacterStr= "CK_SetAttributeOnCharacter"
global CKLoadStr = "CK_Load"
global instNameSet = #()
global instFctSet = #()
global instRolloutSet = #()
global objWithInst = #()
global currentSelectedInst = 1
global objectAsLevel = undefined
global currentChunkBuf = undefined
-------------------------------------------------------------------------------
-- Reading CK Buffer Functions
-------------------------------------------------------------------------------
fn GetCKChunk obj chunkKey = (
local buf = getUserPropBuffer obj
if (buf==undefined) do return undefined
local startIndex = findString buf (CKCHUNKBEGINSTR + " \"" + chunkKey + "\"")
if (startIndex==undefined) do return undefined
local endIndex = findstring buf CKCHUNKENDSTR
if (endIndex==undefined) do return undefined
endIndex += CKCHUNKENDSTR.count
return (substring buf startIndex (endIndex-startIndex))
)
fn ReadCKBufValue paramString paramIsInst:false = (
if (currentChunkBuf==undefined) do return undefined
if (paramString==undefined) do return undefined
local strToFind = if paramIsInst then (paramString+"(\"") else ("\""+paramString+"\", \"")
local tmp = findstring currentChunkBuf strToFind
if (tmp==undefined) do return undefined
tmp += strToFind.count
local buf = substring currentChunkBuf tmp -1
tmp = findstring buf "\""
if (tmp==undefined) do return undefined
return substring buf 1 (tmp-1)
)
fn ReadCKBufValueAsNumber paramString = (
local str = ReadCKBufValue paramString
if (str==undefined) do return undefined
return (execute str)
)
fn ReadCKBufValueAsVector paramString = (
local str = ReadCKBufValue paramString
if (str==undefined) do return undefined
return (execute ("["+str+"]"))
)
fn ReadCKBufValueAsAngle paramString = (
local str = ReadCKBufValue paramString
if (str==undefined) do return undefined
-- Angles are always written "0:angle"
return (execute (substring str 3 -1))
)
fn ReadCKBufValueAsTime paramString = (
local str = ReadCKBufValue paramString
if (str==undefined) do return undefined
-- Times are always written "0m times 0ms"
local tmp = findstring str "s 0ms"
return (execute (substring str 4 (tmp-4)))
)
fn ReadCKBufValueAsBool paramString = (
local str = ReadCKBufValue paramString
if (str==undefined) do return undefined
if (str=="TRUE") then (return true) else (return false)
)
-------------------------------------------------------------------------------
-- Convenient Conversion Functions
-------------------------------------------------------------------------------
fn posAsVirtools v =
(
(v.x as string) + "," + (v.z as string) + "," + (v.y as string)
)
fn boolAsVirtools b =
(
if b then (return "TRUE") else (return "FALSE")
)
fn matrixInParentAsVirtools obj =
(
m = if (obj.parent==undefined) then (obj.transform) else (obj.transform * inverse (obj.parent.transform) )
local row1 = m.row1
local row2 = m.row2
local row3 = m.row3
local row4 = m.row4
local str = "[" + (row1.x as string) + "," + (row1.z as string) + "," + (row1.y as string) + ",0]"
str += "[" + (row3.x as string) + "," + (row3.z as string) + "," + (row3.y as string) + ",0]"
str += "[" + (row2.x as string) + "," + (row2.z as string) + "," + (row2.y as string) + ",0]"
str += "[" + (row4.x as string) + "," + (row4.z as string) + "," + (row4.y as string) + ",1]"
return str
)
-------------------------------------------------------------------------------
-- Export Options Rollout
-------------------------------------------------------------------------------
rollout VirtoolsExportOpt "Export Options" width:408 height:500 category:0 rolledup:true
(
radiobuttons exportas_Radio "" pos:[8,8] width:126 height:48 enabled:true labels:#("Export as Objects", "Export as a Character", "Export Animation Only") default:1 columns:1
edittext charname_Edit "Character Name: " text:"Character" pos:[200,16] width:191 height:16 enabled:false fieldwidth:200
edittext animname_Edit "Animation Name: " text:"Animation" pos:[200,40] width:191 height:16 enabled:true fieldwidth:150
GroupBox generaloptions_Group "General Options" pos:[8,72] width:208 height:96
checkbox onlytexturefilenames_Check "Store only texture filenames" pos:[22,90] width:154 height:16
checkbox rescale_Check "Rescale scene to 1 unit = 1 meter" pos:[22,109] width:184 height:16
checkbox placeasroup_Check "Convert group to places" pos:[22,128] width:152 height:16
checkbox selectiontogroup_Check "Named selections to groups" pos:[22,147] width:152 height:16 default:true
GroupBox physique_Group "Physique conversion" pos:[224,72] width:168 height:56
radiobuttons convert_Radio "" pos:[232,88] width:154 height:32 enabled:true labels:#("Convert to Skin", "Convert to Morph Animation") default:1 columns:1
GroupBox biped_Group "Biped options" pos:[224,128] width:168 height:40
checkbox savebiped_Check "Save biped geometry" pos:[232,146] width:152 height:16
GroupBox line1_Group "" pos:[-4,58] width:410 height:8
GroupBox line2_Group "" pos:[-4,170] width:410 height:8
GroupBox grp22 "Controllers Output" pos:[8,184] width:384 height:96
label only_Label "Only Linear,TCB and Bezier controllers are supported; other controllers will be converted to Linear animation or morph Animation (Mesh modifiers) using the given sampling step:" pos:[16,202] width:196 height:70
label sampling_Label "Sampling Step for..." pos:[279,203] width:98 height:18
spinner sampstepforcontrollers_Spin "Controllers:" pos:[280,227] width:100 height:16 range:[0,10000,3] type:#integer fieldwidth:40
spinner sampstepfordeformables_Spin "Deformable Objects:" pos:[280,249] width:100 height:16 range:[0,10000,3] type:#integer fieldwidth:40
on exportas_Radio changed stat do (
if stat==2 then charname_Edit.enabled=true
else charname_Edit.enabled=false
)
)
-------------------------------------------------------------------------------
-- Export Process Rollout
-------------------------------------------------------------------------------
rollout VirtoolsExportProcess "Export Process" width:408 height:86 category:0
(
spinner report_Spin "" pos:[104,34] width:48 height:16 range:[0,3,0] type:#integer
spinner compression_Spin "" text:"3" pos:[104,8] width:48 height:16 range:[0,9,6] type:#integer
label report_Label "Report log detail level: (0 for no log)" pos:[9,26] width:95 height:26
label compression_Label "Compression level:" pos:[9,8] width:95 height:16
button export_Button "Export" pos:[309,6] width:88 height:20
checkbox onlySelected_Check "Only Selected" pos:[215,10] width:88 height:16
button exactPreview_Button "Exact Preview" pos:[309,32] width:88 height:20
button quickPreview_Button "Quick Preview" pos:[212,32] width:88 height:20
Timer closePreview_Timer "" pos:[360,58] width:24 height:24 interval:50 active:true
on export_Button pressed do
(
local fileName
if( alreadyGivenFileName==undefined ) then (
fileName = getsavefilename caption:"Virtools Export" \
types:"Virtools Export (*.NMO)|*.nmo|Virtools Viewer Export (*.VMO)|*.vmo"\
) else (
fileName = alreadyGivenFileName
alreadyGivenFileName = undefined
)
if fileName != undefined do (
filetype = getfilenametype filename
if filetype == "" do filename += ".nmo"
setwaitcursor()
exportFct fileName
setarrowcursor()
)
)
on exactPreview_Button pressed do
(
previewFct()
)
on quickPreview_Button pressed do
(
quickPreviewFct()
)
on closePreview_Timer tick do
(
if not Virtools_Preview.open do (
removerollout Virtools_Preview VirtoolsWindow
)
)
)
-------------------------------------------------------------------------------
-- Write Settings in the Configuration file
-------------------------------------------------------------------------------
fn WriteConfig = (
local version = getINIsetting configFileName configSettingSection "Version"
if (version!="2") do (createfile configFileName)
setINIsetting configFileName configSettingSection "Version" "2"
setINIsetting configFileName configSettingSection "Export As" (VirtoolsExportOpt.exportas_Radio.state as string)
setINIsetting configFileName configSettingSection "Character Name" (VirtoolsExportOpt.charname_Edit.text as string)
setINIsetting configFileName configSettingSection "Animation Name" (VirtoolsExportOpt.animname_Edit.text as string)
setINIsetting configFileName configSettingSection "Only Texture Filenames" (VirtoolsExportOpt.onlytexturefilenames_Check.state as string)
setINIsetting configFileName configSettingSection "Rescale" (VirtoolsExportOpt.rescale_Check.state as string)
setINIsetting configFileName configSettingSection "Group To Place" (VirtoolsExportOpt.placeasroup_Check.state as string)
setINIsetting configFileName configSettingSection "Selection To Group" (VirtoolsExportOpt.selectiontogroup_Check.state as string)
setINIsetting configFileName configSettingSection "Physique Conversion" (VirtoolsExportOpt.convert_Radio.state as string)
setINIsetting configFileName configSettingSection "Sampling Controllers" (VirtoolsExportOpt.sampstepforcontrollers_Spin.value as string)
setINIsetting configFileName configSettingSection "Sampling Deformables" (VirtoolsExportOpt.sampstepfordeformables_Spin.value as string)
setINIsetting configFileName configSettingSection "Compression level" (VirtoolsExportProcess.compression_Spin.value as string)
setINIsetting configFileName configSettingSection "Report level" (VirtoolsExportProcess.report_Spin.value as string)
setINIsetting configFileName configSettingSection "Only Selected" (VirtoolsExportProcess.onlySelected_Check.state as string)
)
-------------------------------------------------------------------------------
-- Read Settings in the Configuration file
-------------------------------------------------------------------------------
fn ReadConfig = (
local version = getINIsetting configFileName configSettingSection "Version"
if (version!="2") do (return false)
VirtoolsExportOpt.exportas_Radio.state = (getINIsetting configFileName configSettingSection "Export As") as integer
VirtoolsExportOpt.charname_Edit.text = (getINIsetting configFileName configSettingSection "Character Name")
VirtoolsExportOpt.animname_Edit.text = (getINIsetting configFileName configSettingSection "Animation Name")
VirtoolsExportOpt.onlytexturefilenames_Check.state = (getINIsetting configFileName configSettingSection "Only Texture Filenames")=="true"
VirtoolsExportOpt.rescale_Check.state = (getINIsetting configFileName configSettingSection "Rescale")=="true"
VirtoolsExportOpt.placeasroup_Check.state= (getINIsetting configFileName configSettingSection "Group To Place")=="true"
VirtoolsExportOpt.selectiontogroup_Check.state = (getINIsetting configFileName configSettingSection "Selection To Group")=="true"
VirtoolsExportOpt.convert_Radio.state = (getINIsetting configFileName configSettingSection "Physique Conversion") as integer
VirtoolsExportOpt.sampstepforcontrollers_Spin.value = (getINIsetting configFileName configSettingSection "Sampling Controllers") as integer
VirtoolsExportOpt.sampstepfordeformables_Spin.value = (getINIsetting configFileName configSettingSection "Sampling Deformables") as integer
VirtoolsExportProcess.compression_Spin.value = (getINIsetting configFileName configSettingSection "Compression level") as integer
VirtoolsExportProcess.report_Spin.value = (getINIsetting configFileName configSettingSection "Report level") as integer
VirtoolsExportProcess.onlySelected_Check.state = (getINIsetting configFileName configSettingSection "Only Selected")=="true"
)
-------------------------------------------------------------------------------
-- Export function
-- it can be called when hiting Export button, Quick Preview button or Exact
-- Preview buttton.
-------------------------------------------------------------------------------
fn exportFct fileName =
(
-- Really Do Export
WriteConfig()
export2nmo fileName \
VirtoolsExportProcess.onlySelected_Check.checked \
VirtoolsExportOpt.exportas_Radio.state \
VirtoolsExportOpt.onlytexturefilenames_Check.checked \
VirtoolsExportOpt.rescale_Check.checked \
VirtoolsExportOpt.placeasroup_Check.checked \
VirtoolsExportOpt.selectiontogroup_Check.checked \
(VirtoolsExportOpt.convert_Radio.state == 1) \
VirtoolsExportOpt.savebiped_Check.checked \
VirtoolsExportOpt.sampstepforcontrollers_Spin.value \
VirtoolsExportOpt.sampstepfordeformables_Spin.value \
VirtoolsExportProcess.compression_Spin.value\
VirtoolsExportProcess.report_Spin.value\
VirtoolsExportOpt.charname_Edit.text\
VirtoolsExportOpt.animname_Edit.text
)
-------------------------------------------------------------------------------
-- Preview Function
-------------------------------------------------------------------------------
fn previewFct = (
setwaitcursor()
exportFct previewFileName
if Virtools_Preview.open then (
Virtools_Preview.ax.load previewFileName
) else (
addrollout Virtools_Preview VirtoolsWindow
)
setarrowcursor()
)
-------------------------------------------------------------------------------
-- Get Level Object
-------------------------------------------------------------------------------
fn GetLevelObject = (
local virtoolsGlobalHelper = $VirtoolsGlobalHelper
if (virtoolsGlobalHelper!=undefined) do return (objectAsLevel=virtoolsGlobalHelper)
if (geometry==undefined) do return (objectAsLevel=undefined)
if (geometry!=undefined and geometry.count!=0) then ( objectAsLevel=geometry[1] )
else if (ligths!=undefined and ligths.count!=0) then ( objectAsLevel=lights[1] )
else if (cameras!=undefined and cameras.count!=0) then ( objectAsLevel=cameras[1] )
else if (helpers!=undefined and helpers.count!=0) then ( objectAsLevel=helpers[1] )
else if (shapes!=undefined and shapes.count!=0) then ( objectAsLevel=shapes[1] )
else undefined
objectAslevel
)
-------------------------------------------------------------------------------
-- Quick Preview Function
-------------------------------------------------------------------------------
fn quickPreviewFct = (
--------------------
-- Add Instructions
if (GetLevelObject()==undefined) do return
-- set camera
activeCamera = undefined
orbitCamera = undefined
createdCamera = undefined
local centerToLookAt = geometry.center
if (selection.count!=0) do centerToLookAt = selection.center
if (cameras.count!=0) then (
activeCamera = cameras[1]
orbitCamera = activeCamera
if (activeCamera.parent!=undefined) do (
if activeCamera.parent.isAnimated do (orbitCamera=undefined)
)
if ( (findstring (getUserPropBuffer orbitCamera) CKCHUNKBEGINSTR)!=undefined ) do (orbitCamera=undefined)
) else (
if not gw.isperspview() do (
for a=1 to viewport.numviews do (
viewport.activeViewport = a
if gw.isperspview() do exit
)
)
orbitCamera = freecamera name:"Camera01"
if gw.isperspview() then (
orbitCamera.fov = getviewfov()
orbitCamera.transform = Inverse(getviewTM())
orbitCamera.pos = (Inverse(getViewTM())).row4
) else (
orbitCamera.pos = geometry.max
orbitCamera.dir = centerToLookAt
orbitCamera.fov = 45.0
)
createdCamera = orbitCamera
activeCamera = orbitCamera
selectMore createdCamera
)
if (orbitCamera!=undefined) do (
chunkData = " " + CKAttacheScriptOnThisStr + "(\"Camera Orbit\")\x0d\x0a"
chunkData += " " + CKSetParamOnThisStr + "(\"Center To Look At\", \"" + (posAsVirtools centerToLookAt) + "\" )\x0d\x0a"
AddCKChunk activeCamera "Quick Preview Camera Orbit" chunkData
)
if (activeCamera!=undefined) do (
chunkData = " " + CKAttacheScriptOnThisStr + "(\"set_as_active_camera\")\x0d\x0a"
AddCKChunk activeCamera "Quick Preview Active Camera" chunkData
)
-- set light
createdLight = undefined
if (lights.count==0) do (
createdLight = omnilight name:"Omni01" color:[255,255,255]
createdLight.pos = activeCamera.pos
createdLight.parent = activeCamera
selectMore createdLight
)
-- set animation
if (objectAsLevel!=undefined) do (
-- chunkData = " " + CKAttacheScriptOnThisStr + "(\"Play Global Animation\")\x0d\x0a"
-- chunkData += " " + CKSetParamOnThisStr + "(\"Global Animation Name\", \"CK_EXPORTEDANIMATION\" )\x0d\x0a"
-- duration = (animationrange.end.frame-animationrange.start.frame)/(framerate * 0.125 * pow 2 timeconfiguration.playbackspeed)
-- chunkData += " " + CKSetParamOnThisStr + "(\"Global Animation Duration\", \"0m " + (duration as string) + "s 0ms\" )\x0d\x0a"
-- AddCKChunk objectAsLevel "Quick Preview Play Global Animation" chunkData
)
-----------
-- Preview
previewFct ()
------------------------------
-- Remove Added Intstructions
if (activeCamera!=undefined) do (RemoveCKChunk activeCamera "Quick Preview Active Camera"; activeCamera=undefined)
if (orbitCamera!=undefined) do (RemoveCKChunk orbitCamera "Quick Preview Camera Orbit"; orbitCamera=undefined)
if (createdCamera!=undefined) do (delete createdCamera; createdCamera=undefined)
if (createdLight!=undefined) do (delete createdLight; createdLight=undefined)
if (objectAsLevel!=undefined) do (RemoveCKChunk objectAsLevel "Quick Preview Play Global Animation"; objectAsLevel=undefined)
updateInstructionsList()
)
-------------------------------------------------------------------------------
-- Preview Rollout
-------------------------------------------------------------------------------
rollout Virtools_Preview "Preview" width:408 height:300 category:0
(
ActiveXControl ax "{C4925E65-7A1E-11D2-8BB4-00A0C9CC72C3}" pos:[4,4] width:394 height:298 align:#left setupEvents:false
on Virtools_Preview open do
(
ax.allowpause = 1
ax.src = previewFileName
ax.keepkeyboard = 0
ax.AllowFullScreen = 0
enableAccelerators = false
)
)
-------------------------------------------------------------------------------
-- Instructions Manager
-------------------------------------------------------------------------------
rollout VirtoolsInstructionsManager "Instructions Manager" width:408 height:178 category:1
(
listbox instructionsApplied_List "Applied Instructions:" pos:[232,8] width:162 height:6
button removeInst_Button "Remove" pos:[232,114] width:78 height:24 enabled:false
button removeAllInst_Button "Remove All" pos:[314,114] width:80 height:24 enabled:false
GroupBox sepInstList_Group "" pos:[204,0] width:1 height:140
listbox instructions_List " " pos:[12,8] width:162 height:8
checkbutton instset_Check "Instruction Set:" pos:[12,8] width:80 height:16 checked:true
checkbutton objlist_Check "Object List:" pos:[94,8] width:80 height:16
--------------------------------------
-- Update Instruction Set List
--------------------------------------
fn updateInstSetList = (
instructions_List.selection = 0
if instset_Check.checked then (
instructions_List.items = instNameSet
) else (
objWithInst = #()
for obj in objects do (
buf = getUserPropBuffer obj
tmpStart = findstring buf CKCHUNKBEGINSTR
if (tmpStart!=undefined) do (
objWithInst += #(obj)
)
)
instructions_List.items = #()
n=1
for obj in objWithInst do (
if obj!=undefined do (
instructions_List.items += #(obj.name)
n += 1
)
)
)
updateInstructionsList()
)
on instset_Check changed state do (
objlist_Check.checked = not state
updateInstSetList()
)
on objlist_Check changed state do (
instset_Check.checked = not state
updateInstSetList()
)
on instructionsApplied_List selected index do (
if instset_Check.checked do (instructions_List.selection=0)
removeInst_Button.enabled = true
removeAllInst_Button.enabled = true
currentSelectedInst = finditem instNameSet (instructionsApplied_List.selected)
if( currentSelectedInst!=0 ) do (
instRollout = instRolloutSet[currentSelectedInst]
if (currentRollout!=instRollout) then (
if( currentRollout!=unsupplied ) do (
removerollout currentRollout VirtoolsWindow
)
)
if (instRollout!=unsupplied) do (
addrollout instRollout VirtoolsWindow
currentRollout = instRollout
instRollout.UpdateFromChunk()
)
)
)
on instructions_List selected index do (
if instset_Check.checked then (
-- Instruction List case
currentSelectedInst = index
instRollout = instRolloutSet[index]
if (currentRollout!=instRollout) then (
if (currentRollout!=unsupplied) do (
removerollout currentRollout VirtoolsWindow
)
) else (
)
if (instRollout!=unsupplied) do (
addrollout instRollout VirtoolsWindow
currentRollout = instRollout
)
) else (
-- Object List case
select objWithInst[instructions_List.selection]
)
instructionsApplied_List.selection = 0
removeInst_Button.enabled = false
removeAllInst_Button.enabled = false
)
on instructions_List doubleClicked index do (
if instset_Check.checked do (
-- Instruction List case
currentSelectedInst = index
(instFctSet[index])()
)
)
on removeInst_Button pressed do
(
if( ($!=undefined) and (instructionsApplied_List.selection!=0) ) do (
RemoveCKChunk $ instructionsApplied_List.selected
updateInstSetList()
)
)
on removeAllInst_Button pressed do
(
if( $ != undefined ) do (
while( (RemoveCKChunk $ "") != undefined ) do ()
updateInstSetList()
)
)
)
-------------------------------------------------------------------------------
-- Add CK CHUNK
-------------------------------------------------------------------------------
fn AddCKChunk obj chunkKey chunkData AllowMultipleChunk:false = (
-- as we add some instruction, we can then create the virtools global helper
-- if it doesn't exists
local virtoolsGlobalHelper = $VirtoolsGlobalHelper
if (virtoolsGlobalHelper==undefined) do (dummy name:"VirtoolsGlobalHelper" pos:[0,0,-100] scale:[0.1,0.1,0.1])
if (obj==undefined) do (obj=virtoolsGlobalHelper)
buf = getUserPropBuffer obj
if not AllowMultipleChunk do (
local startIndex = findString buf (CKCHUNKBEGINSTR + " \"" + chunkKey + "\"")
if( startIndex != undefined ) do return ok
)
buf += CKCHUNKBEGINSTR + " \"" + chunkKey + "\"\x0d\x0a"
buf += chunkData
buf += CKCHUNKENDSTR + "\x0d\x0a"
setUserPropBuffer obj buf
)
-------------------------------------------------------------------------------
-- Remove CK CHUNK
-- if chunkey == "" removes the first CKCHUNK found
-- return value = index of the found CKCHUNK, undefined if not found
-------------------------------------------------------------------------------
fn RemoveCKChunk obj chunkKey = (
buf = getUserPropBuffer obj
-- remove doubled carriage return
local tmpIndex = findstring buf "\x0d\x0a\x0d\x0a"
while (tmpIndex!=undefined) do (
buf = replace buf tmpIndex 4 "\x0d\x0a"
tmpIndex = findstring buf "\x0d\x0a\x0d\x0a"
)
--
local startIndex
if( chunkKey=="" ) then (
startIndex = findString buf CKCHUNKBEGINSTR
) else (
startIndex = findString buf (CKCHUNKBEGINSTR + " \"" + chunkKey + "\"")
)
if( startIndex != undefined ) do (
buf1 = substring buf 1 (startIndex-1)
buf = substring buf startIndex -1
endIndex = (findstring buf CKCHUNKENDSTR) + CKCHUNKENDSTR.count
if( endIndex != undefined ) do (
buf2 = substring buf endIndex -1
setUserPropBuffer obj (buf1+buf2)
)
)
startIndex
)
-------------------------------------------------------------------------------
-- Update Applied Instructions List
-------------------------------------------------------------------------------
fn updateInstructionsList = (
local instructionStr = undefined
instructionList = #()
if( selection.count==1 ) do (
buf = getUserPropBuffer selection[1]
tmpStart = findstring buf (CKCHUNKBEGINSTR+" \"")
while (tmpStart!=undefined) do (
tmpStart += (CKCHUNKBEGINSTR+" \"").count
buf = substring buf tmpStart -1
tmpEnd = findstring buf "\""
if (tmpEnd!=undefined) do (
instructionStr = substring buf 1 (tmpEnd-1)
append instructionList instructionStr
)
tmpStart = findstring buf (CKCHUNKBEGINSTR+" \"")
)
if not VirtoolsInstructionsManager.instset_Check.checked do (
VirtoolsInstructionsManager.instructions_List.selection = 0
if instructionStr!=undefined do (
local tmp = finditem (VirtoolsInstructionsManager.instructions_List.items) (selection[1].name)
VirtoolsInstructionsManager.instructions_List.selection = tmp
)
)
)
VirtoolsInstructionsManager.instructionsApplied_List.items = instructionList
VirtoolsInstructionsManager.instructionsApplied_List.selection = 0
VirtoolsInstructionsManager.removeInst_Button.enabled = false
VirtoolsInstructionsManager.removeAllInst_Button.enabled = false
)
-------------------------------------------------------------------------------
-- Register Instruction Function
-------------------------------------------------------------------------------
fn registerInstruction instName instFct instRollout: instReadFct: = (
append instNameSet instName
append instFctSet instFct
append instRolloutSet instRollout
if VirtoolsInstructionsManager.instset_Check.state do (
VirtoolsInstructionsManager.instructions_List.items += #(instName)
)
)
VirtoolsWindow = newrolloutfloater "Virtools Exporter" 428 600 0 1
addrollout VirtoolsExportOpt VirtoolsWindow
addrollout VirtoolsExportProcess VirtoolsWindow
addrollout VirtoolsInstructionsManager VirtoolsWindow
ReadConfig()
VirtoolsInstructionsManager.instructions_List.selection = 0
VirtoolsInstructionsManager.instructionsApplied_List.selection = 0
callbacks.removeScripts #selectionsetchanged id:#VirtoolsUpdateList
callbacks.addScript #selectionsetchanged "updateInstructionsList()" id:#VirtoolsUpdateList
callbacks.broadcastCallback #selectionsetchanged
-------------------------------------------------------------------------------
-- Register Instructions
-------------------------------------------------------------------------------
files = getFiles (CKInstPath+"CK_*.ms")
for f in files do ( filein f )