mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-18 05:11:42 +00:00
855 lines
22 KiB
Text
855 lines
22 KiB
Text
|
global systempreferencefilename = "\\\Amiga\\3D\\Database\\system\\zs_sys_prefs.ini",
|
|||
|
--global systempreferencefilename = "c:\\zs_sys_prefs.ini",
|
|||
|
ProjectPath = (getINISetting systempreferencefilename "Filepath" "ProjectPath")
|
|||
|
error_list_file = "\\\Amiga\\3D\\Database\\system\\zonefiles_error_list.ini" -- pour faire fichier de report
|
|||
|
error_array ; if error_array == undefined do error_array = #()
|
|||
|
|
|||
|
rollout dbase_cleaner_rollout "Database Zone Project Cleaner"
|
|||
|
(
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
-- ui elements def
|
|||
|
----------------------------------------------------------------
|
|||
|
group "The Checker "
|
|||
|
(
|
|||
|
Button CheckTheDatabase "Check the Database" width:110
|
|||
|
-- CheckBox CheckOnly "report only please" checked:true
|
|||
|
-- Label textcheck "(Don't modify Database)" enabled:true
|
|||
|
-- Label textclean "(Do Clean the Database)" enabled:false
|
|||
|
progressbar progress_bar color:blue width:588
|
|||
|
Label textcurrentproj "Current file : --" enabled:false align:#left
|
|||
|
)
|
|||
|
|
|||
|
group "The Files "
|
|||
|
(
|
|||
|
label Count_Files "--" align:#left across:2
|
|||
|
button reset_lists "Reset" width:50
|
|||
|
listbox Files_listbox "Files with possible errors :" height:10 items:error_array
|
|||
|
)
|
|||
|
group "Manual "
|
|||
|
(
|
|||
|
button load_proj "Load" width:50 across:2 enabled:false
|
|||
|
button save_proj "Save" width:50 enabled:false
|
|||
|
button basic_clean "Clean Loaded" width:100 enabled:false
|
|||
|
)
|
|||
|
group "Auto "
|
|||
|
(
|
|||
|
button basic_clean_all "Basic Clean Listed Files " -- enabled:false
|
|||
|
button test_only_basic_clean_all "Tst Bazc Clean Listd Filz" -- enabled:false
|
|||
|
button collapse_nel_patch_all "Collapse all listed"
|
|||
|
progressbar progress_bar2 color:green height:8 width:588
|
|||
|
)
|
|||
|
group "The objects "
|
|||
|
(
|
|||
|
listbox Objects_listbox "Objects in current File :" height:18
|
|||
|
)
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
-- Fonctions def
|
|||
|
----------------------------------------------------------------
|
|||
|
Fn backupfilezone nomdufichierzone = -- backup a file named day and time and oldfilename in a subdir named (the number of the week 0-51)
|
|||
|
(
|
|||
|
local s=localtime , s1 , tabjourdesmois , nb_jours , i , semaineencours , file2backup , nouveaunomdefichier , sfinale="__" , directory4backup , s1= filterstring s "/ :" , tabjourdesmois=#("31","28","31","30","31","30","31","31","30","31","30","31")
|
|||
|
if s1[3]=="00" or s1[3]=="04" or s1[3]=="08" then tabjourdesmois[2]=((tabjourdesmois[2] as integer) +1) as string -- ann<6E>es bisextiles
|
|||
|
nb_jours=0 --determiner le numero de la semaine
|
|||
|
for i=1 to ((s1[2] as integer)-1) do -- ajouter les jours de chaque mois <20>coul<75>
|
|||
|
(
|
|||
|
nb_jours=nb_jours + (tabjourdesmois[i] as integer)
|
|||
|
)
|
|||
|
nb_jours=nb_jours + (s1[1] as integer) -- ajouter les jours <20>coul<75>s du mois courant
|
|||
|
semaineencours = nb_jours/7
|
|||
|
if (getfiles (projectpath + (semaineencours as string) + "\\\\" + nomdufichierzone + ".max")).count == 0 -- creation du repertoire de backup
|
|||
|
then (makedir (projectpath + (semaineencours as string) + "\\" )) else (print "le repertoire existe d<>j<EFBFBD>, pas besoin de le cr<63>er")
|
|||
|
for i=1 to S1.count do ( sfinale=sfinale + "_" + s1[i]) --determiner le nouveau nom de fichier : date + heure
|
|||
|
copyfile (projectpath + nomdufichierzone + ".max") (projectpath + (semaineencours as string) + "\\\\" + nomdufichierzone + sfinale + ".max") -- bouger le fichier dans le repertoire de backup
|
|||
|
print ("fin du backup")
|
|||
|
|
|||
|
)
|
|||
|
|
|||
|
Fn delete_unwanted_entitys = -- materials / camera / shapes....
|
|||
|
(
|
|||
|
-- undefined LM_DATA persistent array
|
|||
|
LM_DATA = undefined
|
|||
|
print "LM_Data array undefined"
|
|||
|
|
|||
|
-- clean the material editor
|
|||
|
for i = 1 to meditMaterials.count do (meditMaterials[i]=standard()) -- reset material editor
|
|||
|
|
|||
|
-- delete cameras
|
|||
|
delete cameras
|
|||
|
|
|||
|
-- delete unwanted names
|
|||
|
obj_to_delete = #()
|
|||
|
for i in objects do
|
|||
|
(
|
|||
|
if ((matchpattern (i.name) pattern:"* name")==true) AND ( matchpattern (i.name) pattern:((getfilenamefile maxfilename)+" name"))==false -- l'objet est un nom *ET* n'est pas celui du projet.
|
|||
|
then
|
|||
|
(
|
|||
|
append obj_to_delete i
|
|||
|
)
|
|||
|
)
|
|||
|
print "deleting objects : "
|
|||
|
print obj_to_delete
|
|||
|
delete obj_to_delete
|
|||
|
)
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
-- ui process def
|
|||
|
----------------------------------------------------------------
|
|||
|
on CheckOnly changed arg do
|
|||
|
(
|
|||
|
textcheck.enabled = arg
|
|||
|
textclean.enabled = NOT arg
|
|||
|
)
|
|||
|
|
|||
|
fn lowercase instring = -- beginning of function definition
|
|||
|
(
|
|||
|
local upper, lower, outstring -- declare variables as local
|
|||
|
upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ" -- set variables to literals
|
|||
|
lower="abcdefghijklmnopqrstuvwxyz"
|
|||
|
outstring=instring
|
|||
|
for i=1 to outstring.count do
|
|||
|
(
|
|||
|
j=findString upper outstring[i]
|
|||
|
if (j != undefined) do outstring[i]=lower[j]
|
|||
|
)
|
|||
|
return outstring -- value of outstring will be returned as function result
|
|||
|
)
|
|||
|
|
|||
|
fn findID node =
|
|||
|
(
|
|||
|
local
|
|||
|
|
|||
|
-- Const
|
|||
|
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|||
|
NameTab = filterString node.name "_"
|
|||
|
if (NameTab != undefined) and (NameTab.count == 2) then
|
|||
|
(
|
|||
|
Z_ID = -1
|
|||
|
alpha_letter1 = NameTab[2][1]
|
|||
|
alpha_letter2 = NameTab[2][2]
|
|||
|
alpha_letter1_value = findstring alphabet alpha_letter1
|
|||
|
alpha_letter2_value = findstring alphabet alpha_letter2
|
|||
|
|
|||
|
-- Decompose theh name in an array array[1]=numeric string value array[2]=alpha string value
|
|||
|
-- The index of the engine start at 0 but the script one at 1 so we sub 1 each time
|
|||
|
alpha_sub_id = (((alpha_letter1_value as integer - 1) * 26 + (alpha_letter2_value as integer)))-1
|
|||
|
num_sub_id = (NameTab[1] as integer)-1
|
|||
|
|
|||
|
-- Array of 256 per 256
|
|||
|
---------------------------
|
|||
|
-- 0 1 2 3 ... 255
|
|||
|
-- 256 257 258 259 ... 511
|
|||
|
-- 512 513 514 515 ... 767
|
|||
|
-- ...
|
|||
|
|
|||
|
Z_ID = num_sub_id*256 + alpha_sub_id
|
|||
|
|
|||
|
return Z_ID
|
|||
|
)
|
|||
|
else
|
|||
|
return 0
|
|||
|
)
|
|||
|
|
|||
|
fn idToCoord coord =
|
|||
|
(
|
|||
|
zoneX = floor (coord.x/160)
|
|||
|
zoneY = floor (-coord.y/160)
|
|||
|
|
|||
|
return zoneY*256 + zoneX;
|
|||
|
)
|
|||
|
|
|||
|
fn atTheGoodPosition node =
|
|||
|
(
|
|||
|
-- Get the center
|
|||
|
center = node.center
|
|||
|
|
|||
|
-- Check position
|
|||
|
if (findID node) == (idToCoord center) then
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
)
|
|||
|
|
|||
|
--------------------
|
|||
|
on CheckTheDatabase pressed do
|
|||
|
(
|
|||
|
--remettre <20> zero
|
|||
|
error_array = #()
|
|||
|
Files_listbox.items = error_array
|
|||
|
deletefile error_list_file
|
|||
|
progress_bar.value = 0
|
|||
|
|
|||
|
--
|
|||
|
textcurrentproj.enabled = true
|
|||
|
project_files = getFiles ( projectpath + "*.max" )
|
|||
|
counter = 0
|
|||
|
|
|||
|
Files_listbox.items = error_array
|
|||
|
|
|||
|
for f in project_files do
|
|||
|
(
|
|||
|
-- Error ?
|
|||
|
bFound = false
|
|||
|
bMultiZone = false
|
|||
|
bWrongName = false
|
|||
|
bWrongMaterial = false
|
|||
|
bLoaded = false
|
|||
|
bWrongPosition = false
|
|||
|
|
|||
|
-- Name of the file
|
|||
|
fileName = getFilenameFile f
|
|||
|
|
|||
|
-- Load the project
|
|||
|
try
|
|||
|
(
|
|||
|
if (loadMaxFile f) == true then
|
|||
|
(
|
|||
|
-- Zone loaded
|
|||
|
bLoaded = true
|
|||
|
|
|||
|
-- Check there is only one zone with the name of the file
|
|||
|
for node in geometry do
|
|||
|
(
|
|||
|
-- It is a NeL zone ?
|
|||
|
if (classof node) == RklPatch then
|
|||
|
(
|
|||
|
-- Already a zone ?
|
|||
|
if bFound == true then
|
|||
|
bMultiZone = true
|
|||
|
|
|||
|
-- A zone has been found
|
|||
|
bFound = true
|
|||
|
|
|||
|
-- The same name ?
|
|||
|
if (lowercase fileName) != (lowercase node.name) then
|
|||
|
(
|
|||
|
bWrongName = true
|
|||
|
)
|
|||
|
|
|||
|
-- The position
|
|||
|
if (atTheGoodPosition node) == false then
|
|||
|
bWrongPosition = true
|
|||
|
)
|
|||
|
|
|||
|
-- The material..
|
|||
|
if (classof node.material) == MultiMaterial then
|
|||
|
(
|
|||
|
-- Big material ?
|
|||
|
if (node.material.numsubs > 20) then
|
|||
|
(
|
|||
|
bWrongMaterial = true
|
|||
|
)
|
|||
|
)
|
|||
|
)
|
|||
|
)
|
|||
|
)
|
|||
|
catch
|
|||
|
(
|
|||
|
)
|
|||
|
|
|||
|
-- Set error
|
|||
|
bError = (bWrongPosition == true) or (bWrongMaterial == true) or (bWrongName == true) or (bMultiZone == true) or (bFound == false) or (bLoaded == false)
|
|||
|
|
|||
|
-- Set error message
|
|||
|
errorMessage = fileName
|
|||
|
if bLoaded == false then
|
|||
|
(
|
|||
|
errorMessage += ", can't load it"
|
|||
|
)
|
|||
|
if bFound == false then
|
|||
|
(
|
|||
|
errorMessage += ", can't found a NeL patch object"
|
|||
|
)
|
|||
|
if bMultiZone == true then
|
|||
|
(
|
|||
|
errorMessage += ", multiple NeL zone"
|
|||
|
)
|
|||
|
if bWrongName == true then
|
|||
|
(
|
|||
|
errorMessage += ", NeL zone has a wrong name"
|
|||
|
)
|
|||
|
if bWrongMaterial == true then
|
|||
|
(
|
|||
|
errorMessage += ", NeL zone has a big material"
|
|||
|
)
|
|||
|
if bWrongPosition == true then
|
|||
|
(
|
|||
|
errorMessage += ", NeL zone position is wrong"
|
|||
|
)
|
|||
|
|
|||
|
-- Append error ?
|
|||
|
if bError == true then
|
|||
|
(
|
|||
|
setinisetting error_list_file "Zone error" fileName errorMessage
|
|||
|
|
|||
|
append error_array errorMessage
|
|||
|
|
|||
|
Count_Files.text = error_array.count as string
|
|||
|
Files_listbox.items = error_array
|
|||
|
Files_listbox.selection += 1
|
|||
|
print (" ---> project : " + filenamefrompath f)
|
|||
|
)
|
|||
|
|
|||
|
progress_bar.value = 100.*counter/project_files.count
|
|||
|
counter += 1
|
|||
|
)
|
|||
|
if counter >0
|
|||
|
then
|
|||
|
(
|
|||
|
Files_listbox.selection = 1
|
|||
|
basic_clean_all.enabled = true
|
|||
|
test_only_basic_clean_all.enabled = true
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
on Files_listbox doubleClicked error_list_index do
|
|||
|
(
|
|||
|
-- Load the project
|
|||
|
fileName = filterString Files_listbox.items[error_list_index] ","
|
|||
|
if (fileName != undefined) and (fileName.count != 0) then
|
|||
|
(
|
|||
|
-- Make a file name
|
|||
|
fileName = ProjectPath+"\\"+fileName[1]+".max"
|
|||
|
loadMaxFile fileName
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
on Files_listbox selected error_list_index do
|
|||
|
(
|
|||
|
--load_proj.enabled = true
|
|||
|
--Objects_listbox.enabled = false -- juste pour montrer que <20>a bosse
|
|||
|
--Files_listbox.enabled = false -- juste pour montrer que <20>a bosse
|
|||
|
--Count_Files.enabled = false -- juste pour montrer que <20>a bosse
|
|||
|
|
|||
|
--Current_proj = (ProjectPath + Files_listbox.selected )
|
|||
|
--Objects_listbox.items = (getMAXFileObjectNames current_proj)
|
|||
|
|
|||
|
--Count_Files.enabled = true -- juste pour montrer que <20>a bosse
|
|||
|
--Files_listbox.enabled = true -- juste pour montrer que <20>a bosse
|
|||
|
--Objects_listbox.enabled = true -- juste pour montrer que <20>a bosse
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
on reset_lists pressed do
|
|||
|
(
|
|||
|
error_array = #()
|
|||
|
Files_listbox.items = error_array
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
on load_proj pressed do
|
|||
|
(
|
|||
|
loadMaxFile (ProjectPath + Files_listbox.selected )
|
|||
|
messagebox ("Loaded project for zone : " + Files_listbox.selected + "\n \n Please Clean the project and save")
|
|||
|
max unhide all
|
|||
|
save_proj.enabled = true
|
|||
|
basic_clean.enabled = true
|
|||
|
)
|
|||
|
|
|||
|
on save_proj pressed do
|
|||
|
(
|
|||
|
if (querybox ("Do You Really want to overwrite this ZONE ?\n" + MaxFileName )) == true and querybox "Really sure ?" == true
|
|||
|
then
|
|||
|
(
|
|||
|
print ("saving zone : " + MaxFileName)
|
|||
|
save_proj.enabled = false
|
|||
|
backupfilezone (getfilenameFile MaxFileName)
|
|||
|
print (" zone backuped : " + MaxFileName)
|
|||
|
max file save
|
|||
|
print (" zone saved : " + MaxFileName)
|
|||
|
)
|
|||
|
else
|
|||
|
(
|
|||
|
print ("no save for : " + MaxFileName)
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
on basic_clean pressed do
|
|||
|
(
|
|||
|
delete_unwanted_entitys()
|
|||
|
-- basic_clean.enabled = false
|
|||
|
)
|
|||
|
|
|||
|
on basic_clean_all pressed do
|
|||
|
(
|
|||
|
compteurdeligne = 0
|
|||
|
for proj_file in Files_listbox.items do
|
|||
|
(
|
|||
|
compteurdeligne += 1
|
|||
|
progress_bar2.value = 100.*compteurdeligne/Files_listbox.items.count
|
|||
|
Files_listbox.selection = compteurdeligne
|
|||
|
print ("processing file : " + proj_file)
|
|||
|
|
|||
|
loadMaxFile (ProjectPath + Files_listbox.selected )
|
|||
|
delete_unwanted_entitys()
|
|||
|
|
|||
|
backupfilezone (getfilenameFile MaxFileName)
|
|||
|
print (" zone backuped : " + MaxFileName)
|
|||
|
max file save
|
|||
|
print (" zone saved : " + MaxFileName)
|
|||
|
|
|||
|
)
|
|||
|
|
|||
|
print ("nombre de projets trait<69>s : " + Files_listbox.items.count as string)
|
|||
|
|
|||
|
if (querybox "Do you want to Build an updated list of possible errors ?" ) == true
|
|||
|
then
|
|||
|
(
|
|||
|
print "faire mise <20> jour "
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
----------------------------------------
|
|||
|
on collapse_nel_patch_all pressed do
|
|||
|
(
|
|||
|
compteurdeligne = 0
|
|||
|
for proj_file in Files_listbox.items do
|
|||
|
(
|
|||
|
compteurdeligne += 1
|
|||
|
progress_bar2.value = 100.*compteurdeligne/Files_listbox.items.count
|
|||
|
Files_listbox.selection = compteurdeligne
|
|||
|
print ("processing file : " + proj_file)
|
|||
|
|
|||
|
loadMaxFile (ProjectPath + Files_listbox.selected )
|
|||
|
|
|||
|
patch_name="$'"+(substring maxfilename 1 (maxfilename.count-4))+"'"
|
|||
|
execute (" obj_to_check = " + patch_name)
|
|||
|
if obj_to_check.modifiers.count != 0
|
|||
|
then
|
|||
|
(
|
|||
|
collapsestack obj_to_check
|
|||
|
backupfilezone (getfilenameFile MaxFileName)
|
|||
|
print (" zone backuped : " + MaxFileName)
|
|||
|
max file save
|
|||
|
print (" zone saved : " + MaxFileName)
|
|||
|
)
|
|||
|
else print ("nothing to do with " + proj_file)
|
|||
|
)
|
|||
|
|
|||
|
print ("nombre de projets trait<69>s : " + Files_listbox.items.count as string)
|
|||
|
|
|||
|
if (querybox "Do you want to Build an updated list of possible errors ?" ) == true
|
|||
|
then
|
|||
|
(
|
|||
|
print "faire mise <20> jour "
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
----------------------------------------
|
|||
|
|
|||
|
on test_only_basic_clean_all pressed do
|
|||
|
(
|
|||
|
compteurdeligne = 0
|
|||
|
for proj_file in Files_listbox.items do
|
|||
|
(
|
|||
|
compteurdeligne += 1
|
|||
|
progress_bar2.value = 100.*compteurdeligne/Files_listbox.items.count
|
|||
|
Files_listbox.selection = compteurdeligne
|
|||
|
print ("processing file : " + proj_file)
|
|||
|
loadMaxFile (ProjectPath + Files_listbox.selected )
|
|||
|
delete_unwanted_entitys()
|
|||
|
|
|||
|
print (" zone tested : " + MaxFileName)
|
|||
|
)
|
|||
|
print ("nombre de projets trait<69>s : " + Files_listbox.items.count as string)
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
on dbase_cleaner_rollout open do
|
|||
|
(
|
|||
|
Count_Files.text = error_array.count as string
|
|||
|
clearlistener()
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
)
|
|||
|
|
|||
|
---------------------------------------------------
|
|||
|
|
|||
|
-- Find and log doubling names
|
|||
|
|
|||
|
|
|||
|
fileType = #( "Shape", "Animations", "Skeleton", "Swt" )
|
|||
|
keyWords = #( #("shape_source_directory"), #("anim_source_directory"), #("skel_source_directory"), #("swt_source_directory") )
|
|||
|
checkMeshName = #( true, false, false, false )
|
|||
|
checkProjectName = #( true, true, true, true )
|
|||
|
objectDouble = #()
|
|||
|
objectDoubleProject = #()
|
|||
|
objectArray = #()
|
|||
|
NEL3D_APPDATA_DONOTEXPORT = 1423062565 -- do not export me : "undefined" = export me
|
|||
|
-- "0" = export me
|
|||
|
-- "1" = DONT expo
|
|||
|
|
|||
|
rollout dbase_cleaner_double_rollout "Database Double Detector"
|
|||
|
(
|
|||
|
-- A button to select the config file
|
|||
|
label ConfigFileLabel "Config files path:" align:#left
|
|||
|
edittext ConfigFile "" width:588
|
|||
|
button SelectConfigFile "Browse for config path" width:588
|
|||
|
dropdownlist TypeCheck "Type of project to check:" items:fileType selection:0
|
|||
|
listbox DirectoryList "List of directory to check:" width:588
|
|||
|
label ExcludeLabel "Excluded names:" align:#left
|
|||
|
edittext Exclude "" width:588
|
|||
|
button Refresh "Refresh list" width:588
|
|||
|
button Check "Check for double" width:588
|
|||
|
listbox DoubleObject "List of project with same object name:" width:588
|
|||
|
listbox DoubleProject "List of project with the same name:" width:588
|
|||
|
|
|||
|
-- On select the config file
|
|||
|
on SelectConfigFile pressed do
|
|||
|
(
|
|||
|
-- Open a file browser
|
|||
|
result = getOpenFileName caption:"Select the build process config file" filename:"config.cfg" types:"Config Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"
|
|||
|
|
|||
|
-- Ok ?
|
|||
|
if (result != undefined) then
|
|||
|
(
|
|||
|
ConfigFile.text = getFilenamePath result
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
-- Get a list of options
|
|||
|
fn getOptions filename keyword array =
|
|||
|
(
|
|||
|
-- Open a file stream
|
|||
|
stream = openFile filename
|
|||
|
|
|||
|
-- Success ?
|
|||
|
if (stream != undefined) then
|
|||
|
(
|
|||
|
-- Look for the keyword
|
|||
|
while (skipToString stream keyword) != undefined do
|
|||
|
(
|
|||
|
-- Remove the '=' caracter
|
|||
|
skipToString stream "="
|
|||
|
|
|||
|
-- Get the option
|
|||
|
line = readLine stream
|
|||
|
|
|||
|
-- Remove spaces
|
|||
|
while (line.count != 0) and (line[1] == " ") do
|
|||
|
(
|
|||
|
line = substring line 2 (line.count-1)
|
|||
|
)
|
|||
|
|
|||
|
-- Remove spaces
|
|||
|
while (line.count != 0) and (line[line.count] == " ") do
|
|||
|
(
|
|||
|
line = substring line 1 (line.count-1)
|
|||
|
)
|
|||
|
|
|||
|
-- Add the options
|
|||
|
append array line
|
|||
|
)
|
|||
|
|
|||
|
-- Close the file
|
|||
|
close stream
|
|||
|
|
|||
|
-- Ok
|
|||
|
return true
|
|||
|
)
|
|||
|
else
|
|||
|
(
|
|||
|
return false
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
fn convertString instring =
|
|||
|
(
|
|||
|
index = findString instring "/"
|
|||
|
while index != undefined do
|
|||
|
(
|
|||
|
instring[index] = "\\"
|
|||
|
index = findString instring "/"
|
|||
|
)
|
|||
|
return instring
|
|||
|
)
|
|||
|
|
|||
|
-- Add the object
|
|||
|
fn addObjectToList name path =
|
|||
|
(
|
|||
|
append objectDouble (name + " - " + (filenameFromPath (convertString path)) + " - " + (getFilenamePath (convertString path)) )
|
|||
|
append objectDoubleProject path
|
|||
|
)
|
|||
|
|
|||
|
-- File type selected
|
|||
|
on TypeCheck selected selection do
|
|||
|
(
|
|||
|
-- Config file path
|
|||
|
siteF = ConfigFile.text + "site.cfg"
|
|||
|
|
|||
|
-- Get the database directory
|
|||
|
databaseDirectory = #()
|
|||
|
if (getOptions siteF "database_directory" databaseDirectory) == true then
|
|||
|
(
|
|||
|
-- Ok ?
|
|||
|
if (databaseDirectory.count == 1) then
|
|||
|
(
|
|||
|
-- Clean the directory list
|
|||
|
copyArray = #()
|
|||
|
DirectoryList.items = copyArray
|
|||
|
|
|||
|
-- Look for the directories
|
|||
|
if selection != 0 then
|
|||
|
(
|
|||
|
-- Directory file path
|
|||
|
directoryFile = ConfigFile.text + "directories.cfg"
|
|||
|
|
|||
|
-- Array of keyword
|
|||
|
directoriesArray = #()
|
|||
|
for keyword in keyWords[selection] do
|
|||
|
(
|
|||
|
if (getOptions directoryFile keyword directoriesArray) == false then
|
|||
|
(
|
|||
|
-- Error message
|
|||
|
Messagebox ("Can't read directory file " + directoryFile)
|
|||
|
return undefined
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
-- Add the directory
|
|||
|
for directory in directoriesArray do
|
|||
|
append copyArray (databaseDirectory[1] + "/" + directory)
|
|||
|
|
|||
|
-- Set the array
|
|||
|
DirectoryList.items = copyArray
|
|||
|
)
|
|||
|
)
|
|||
|
else
|
|||
|
(
|
|||
|
-- Error message
|
|||
|
Messagebox ("Syntax error in config file " + configF)
|
|||
|
)
|
|||
|
)
|
|||
|
else
|
|||
|
(
|
|||
|
-- Error message
|
|||
|
Messagebox ("Can't read config file " + configF)
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
fn lowercase instring = -- beginning of function definition
|
|||
|
(
|
|||
|
local upper, lower, outstring -- declare variables as local
|
|||
|
upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ" -- set variables to literals
|
|||
|
lower="abcdefghijklmnopqrstuvwxyz"
|
|||
|
outstring=instring
|
|||
|
for i=1 to outstring.count do
|
|||
|
(
|
|||
|
j=findString upper outstring[i]
|
|||
|
if (j != undefined) do outstring[i]=lower[j]
|
|||
|
)
|
|||
|
return outstring -- value of outstring will be returned as function result
|
|||
|
)
|
|||
|
|
|||
|
-- Refresh list
|
|||
|
fn refreshList =
|
|||
|
(
|
|||
|
objectDouble = #()
|
|||
|
objectDoubleProject = #()
|
|||
|
|
|||
|
-- Get the keyword list
|
|||
|
keywords = filterString Exclude.text " "
|
|||
|
|
|||
|
-- Search for double
|
|||
|
object = 1
|
|||
|
while object <= objectArray.count-1 do
|
|||
|
(
|
|||
|
-- First names
|
|||
|
firstNames = filterString objectArray[object] ";"
|
|||
|
|
|||
|
-- Filter first name
|
|||
|
same = false
|
|||
|
for keys in keywords do
|
|||
|
(
|
|||
|
if (findString firstNames[1] keys) != undefined then
|
|||
|
(
|
|||
|
same = true
|
|||
|
exit
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
-- Not keyword
|
|||
|
if same == false then
|
|||
|
(
|
|||
|
-- Second names
|
|||
|
secondNames = filterString objectArray[object+1] ";"
|
|||
|
|
|||
|
-- Same name ?
|
|||
|
if firstNames[1] == secondNames[1] then
|
|||
|
(
|
|||
|
-- Add the first
|
|||
|
addObjectToList firstNames[1] firstNames[2]
|
|||
|
|
|||
|
-- Add the other
|
|||
|
while (firstNames[1] == secondNames[1]) do
|
|||
|
(
|
|||
|
-- Add the second
|
|||
|
addObjectToList secondNames[1] secondNames[2]
|
|||
|
|
|||
|
-- Next
|
|||
|
object = object + 1
|
|||
|
|
|||
|
-- Last one ?
|
|||
|
if (object == objectArray.count) then
|
|||
|
exit
|
|||
|
|
|||
|
-- Get the new second
|
|||
|
secondNames = filterString objectArray[object+1] ";"
|
|||
|
)
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
object = object + 1
|
|||
|
)
|
|||
|
|
|||
|
-- Copy the array
|
|||
|
DoubleObject.items = objectDouble
|
|||
|
)
|
|||
|
|
|||
|
-- Refresh
|
|||
|
on Refresh pressed do
|
|||
|
(
|
|||
|
refreshList ()
|
|||
|
)
|
|||
|
|
|||
|
-- Check
|
|||
|
on Check pressed do
|
|||
|
(
|
|||
|
-- Check double name in objects
|
|||
|
if checkMeshName[TypeCheck.selection] == true then
|
|||
|
(
|
|||
|
-- Object array
|
|||
|
objectArray = #()
|
|||
|
|
|||
|
-- For each directory
|
|||
|
for folder in DirectoryList.items do
|
|||
|
(
|
|||
|
-- Get the max files
|
|||
|
files = getFiles (folder+"/*.max")
|
|||
|
for file in files do
|
|||
|
(
|
|||
|
-- Get the object in the max file
|
|||
|
objectsMax = getMAXFileObjectNames file
|
|||
|
|
|||
|
-- For each object
|
|||
|
for object in objectsMax do
|
|||
|
(
|
|||
|
-- Insert a reference
|
|||
|
append objectArray ( (lowercase (object as string) ) + ";" + file)
|
|||
|
)
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
-- Sort the array
|
|||
|
sort objectArray
|
|||
|
|
|||
|
-- Refresh list
|
|||
|
refreshList ()
|
|||
|
)
|
|||
|
else
|
|||
|
DoubleObject.items = #()
|
|||
|
|
|||
|
-- Check double name in prject name
|
|||
|
if checkProjectName[TypeCheck.selection] == true then
|
|||
|
(
|
|||
|
-- Object array
|
|||
|
objectArrayProject = #()
|
|||
|
projectDouble = #()
|
|||
|
|
|||
|
-- For each directory
|
|||
|
for folder in DirectoryList.items do
|
|||
|
(
|
|||
|
-- Get the max files
|
|||
|
files = getFiles (folder+"/*.max")
|
|||
|
for file in files do
|
|||
|
(
|
|||
|
append objectArrayProject ( (filenameFromPath (convertString (lowercase file))) + ";" + (lowercase file) )
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
-- Sort the array
|
|||
|
sort objectArrayProject
|
|||
|
|
|||
|
-- Search for double
|
|||
|
object = 1
|
|||
|
while object <= objectArrayProject.count-1 do
|
|||
|
(
|
|||
|
-- First names
|
|||
|
firstNames = filterString objectArrayProject[object] ";"
|
|||
|
|
|||
|
-- Second names
|
|||
|
secondNames = filterString objectArrayProject[object+1] ";"
|
|||
|
|
|||
|
-- Same name ?
|
|||
|
if firstNames[1] == secondNames[1] then
|
|||
|
(
|
|||
|
-- Add the first
|
|||
|
append projectDouble firstNames[2]
|
|||
|
|
|||
|
-- Add the other
|
|||
|
while (firstNames[1] == secondNames[1]) do
|
|||
|
(
|
|||
|
-- Add the second
|
|||
|
append projectDouble secondNames[2]
|
|||
|
|
|||
|
-- Next
|
|||
|
object = object + 1
|
|||
|
|
|||
|
-- Last one ?
|
|||
|
if (object == objectArrayProject.count) then
|
|||
|
exit
|
|||
|
|
|||
|
-- Get the new second
|
|||
|
secondNames = filterString objectArrayProject[object+1] ";"
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
object = object + 1
|
|||
|
)
|
|||
|
|
|||
|
-- Copy the array
|
|||
|
DoubleProject.items = projectDouble
|
|||
|
)
|
|||
|
else
|
|||
|
DoubleProject.items = #()
|
|||
|
)
|
|||
|
|
|||
|
-- double click in the window
|
|||
|
on DoubleObject doubleClicked index do
|
|||
|
(
|
|||
|
-- Check
|
|||
|
if (index>0) and (index<=objectDoubleProject.count) then
|
|||
|
loadMaxFile objectDoubleProject[index]
|
|||
|
)
|
|||
|
|
|||
|
-- double click in the window
|
|||
|
on DoubleProject doubleClicked index do
|
|||
|
(
|
|||
|
-- Check
|
|||
|
if (index>0) and (index<=DoubleProject.items.count) then
|
|||
|
loadMaxFile DoubleProject.items[index]
|
|||
|
)
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
-- macroscript begins
|
|||
|
----------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if dbase_cleaner_floater != undefined do
|
|||
|
(
|
|||
|
closerolloutfloater dbase_cleaner_floater
|
|||
|
)
|
|||
|
dbase_cleaner_Floater = newRolloutFloater "Database Cleaner" 640 815 800 200
|
|||
|
addrollout dbase_cleaner_rollout dbase_cleaner_Floater rolledUp:true
|
|||
|
addrollout dbase_cleaner_double_rollout dbase_cleaner_Floater rolledUp:true
|
|||
|
|