/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2012 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ struct ObjMatList = [ OML_sObjname : S, OML_iMaterialId : I, OML_bWhole : I, OML_lMatlist : [S r1] ]mkObjMatList;; struct PlugMultiMatlist =[ PMM_lObjectList : [ObjMatList r1], PMM_selected : ObjMatList ]mkPlugMultiMatlist;; fun getMaterialsLists(lobjmatlist)= let nil -> lmatsave in ( let 0 -> i in while (lobjmatlist != nil) do ( let hd lobjmatlist -> objmatstr in ( let [(strcat "object_" (itoa i)) objmatstr.OML_sObjname] -> objnamesave in let [(strcat "idx_" (itoa i)) (itoa objmatstr.OML_iMaterialId)] -> matidxsave in let [(strcat "whole_" (itoa i)) (itoa objmatstr.OML_bWhole)] -> wholesave in set lmatsave = wholesave::matidxsave::objnamesave::lmatsave; let sizelist objmatstr.OML_lMatlist -> nbMaterials in let 0 -> j in while (j < nbMaterials) do ( let nth_list objmatstr.OML_lMatlist j -> mat in let [(strcatn "material_"::(itoa i)::"_"::(itoa j)::nil) mat] -> matsave in set lmatsave = matsave::lmatsave; set j = j + 1; ); ); set lobjmatlist = tl lobjmatlist; set i = i + 1; ); lmatsave; );; fun saveObjMatList(objmatstr, ctrlmatlist)= let getEdCtrlListElems ctrlmatlist -> matlist in set objmatstr.OML_lMatlist = matlist; 0;; fun cbCloseEdit(p)= let p -> [obstr ctrlmatlist ctrltitle ctrlok ctrlcancel] in ( saveObjMatList obstr.PMM_selected ctrlmatlist; let getEdCtrlTextLineValue ctrltitle -> title in let getEdCtrlTextLineValue ctrlok -> okbutton in let getEdCtrlTextLineValue ctrlcancel -> cancelbutton in ["title" title]:: ["okbutton" okbutton]:: ["cancelbutton" cancelbutton]:: (getMaterialsLists obstr.PMM_lObjectList); );; fun fillIdSelector(viewstr, ctrlidx, objname)= if objname == nil then nil else let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) objname -> obj in let SO3EntityNumOfSubEntities obj -> nsubid in if (nsubid == nil) then nil else let nil -> lid in ( let nsubid - 1 -> i in while i >= 0 do ( set lid = (itoa i)::lid; set i = i - 1; ); fillEdCtrlSelect ctrlidx lid; ); selectEdCtrlSelectByPos ctrlidx 0; 0;; fun cbSelectObj(val, type, p)= let p -> [inst winstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlmatname] in let V3DgetDefaultSession viewstr -> sessionstr in let SO3SceneGetObject (V3DgetSession sessionstr) val -> obj in if obj == nil then nil else ( fillIdSelector viewstr ctrlidx val; selectEdCtrlSelectByPos ctrlidx 0; selectEdCtrlSelect ctrlmatname SO3MaterialGetName (SO3EntityGetMaterialByIndex obj 0); setEdCtrlCheckState ctrlwhole 1; setEdCtrlSelectEnable ctrlidx 0; setEdCtrlTextLineValue ctrlobjname val; ); 0;; fun cbCloseRes(ctrlbtn)= setEdCtrlButtonEnable ctrlbtn 1; 0;; fun cbBtnPickObj(ctrlbtn, p)= let p -> [inst winstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlmatname] in ( setEdCtrlButtonEnable ctrlbtn 0; dlgSelectPluginInstanceResource inst winstr iTypeEntity nil mkfun3 @cbSelectObj [inst winstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlmatname] mkfun1 @cbCloseRes ctrlbtn 0; ); 0;; fun cbRefreshBtnSpec(pickbtn, p)= let p -> [ctrlobjname ctrlbtnaddobj] in ( setEdCtrlTextLineValue ctrlobjname ""; setEdCtrlButtonEnable ctrlbtnaddobj 0 ); 0;; fun fillObjectList(ctrlobjlist, obstr)= let obstr.PMM_lObjectList -> l in let sizelist l -> size in let nil -> selectlist in ( while (size > 0) do ( set size = size - 1; let nth_list l size -> objmatstr in if (objmatstr.OML_bWhole) then set selectlist = objmatstr.OML_sObjname::selectlist else set selectlist = (strcatn objmatstr.OML_sObjname::", Id "::(itoa objmatstr.OML_iMaterialId)::nil)::selectlist; ); fillEdCtrlSelect ctrlobjlist selectlist; ); 0;; fun fillMaterialSelector(viewstr, ctrlmatname, obstr)= let V3DgetDefaultSession viewstr -> sessionstr in let SO3EntityGetResourceGroup (SO3SceneGetObject sessionstr.V3D_session obstr.PMM_selected.OML_sObjname) -> grpname in let SO3SceneParseMaterialsFromGroup (V3DgetSession sessionstr) grpname -> lmats in let nil -> lmatnames in ( let (sizelist lmats) - 1-> i in while i >= 0 do ( let nth_list lmats i -> mat in let SO3MaterialGetName mat -> matname in set lmatnames = matname::lmatnames; set i = i - 1; ); fillEdCtrlSelect ctrlmatname (quicksort lmatnames @suppDoublon); ); selectEdCtrlSelectByPos ctrlmatname 0; 0;; fun cbSelectObjMatList(ctrlstr, pos, name, p)= let p -> [obstr viewstr ctrlmatlist ctrlmatname] in ( saveObjMatList obstr.PMM_selected ctrlmatlist; set obstr.PMM_selected = nth_list obstr.PMM_lObjectList pos; fillMaterialSelector viewstr ctrlmatname obstr; fillEdCtrlList ctrlmatlist obstr.PMM_selected.OML_lMatlist; ); 0;; fun cbAddObject(ctrlstr, p)= let p -> [obstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlobjlist ctrlmatlist ctrlmatname] in let getEdCtrlTextLineValue ctrlobjname -> objname in let getSelectedEdCtrlSelectPos ctrlidx -> idx in let getEdCtrlCheckState ctrlwhole -> whole in ( let mkObjMatList[objname idx whole nil] -> newstr in set obstr.PMM_lObjectList = lcat obstr.PMM_lObjectList newstr::nil; fillObjectList ctrlobjlist obstr; let (sizelist obstr.PMM_lObjectList) - 1 -> pos in ( selectEdCtrlSelectByPos ctrlobjlist pos; cbSelectObjMatList ctrlobjlist pos nil [obstr viewstr ctrlmatlist ctrlmatname]; ); setEdCtrlTextLineValue ctrlobjname ""; fillEdCtrlSelect ctrlidx nil; selectEdCtrlSelectByPos ctrlidx 0; setEdCtrlSelectEnable ctrlidx 1; setEdCtrlCheckState ctrlwhole 0; setEdCtrlButtonEnable ctrlstr 0; ); 0;; fun cbRemoveObject(ctrlstr, p)= let p -> [obstr ctrlobjlist ctrlmatlist] in ( set obstr.PMM_lObjectList = remove_from_list obstr.PMM_lObjectList obstr.PMM_selected; fillObjectList ctrlobjlist obstr; set obstr.PMM_selected = nth_list obstr.PMM_lObjectList 0; fillEdCtrlList ctrlmatlist obstr.PMM_selected.OML_lMatlist; ); 0;; fun cbAddList(ctrlstr, p)= let p -> [ctrlmatlist ctrlmatname] in let getSelectedEdCtrlSelect ctrlmatname -> value in if (value == nil) || (!strcmp "" strtrim value) then nil else ( let getEdCtrlListElems ctrlmatlist -> lelem in if (isStringInListi lelem value) then nil else ( addEdCtrlList ctrlmatlist value nil nil; selectEdCtrlSelectByPos ctrlmatname 0; ); ); 0;; fun cbDelList(ctrlstr, p)= let p -> [ctrlmatlist ctrlmatname] in let getSelectedEdCtrlList ctrlmatlist -> [name _ _] in delEdCtrlList ctrlmatlist name; 0;; fun cbObjnameText(ctrlstr, text, p)= let p -> [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj] in let text -> objname in let 0 -> idx in let getEdCtrlCheckState ctrlwhole -> whole in let 0 -> isinlist in ( let sizelist obstr.PMM_lObjectList -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.PMM_lObjectList i -> objmatstr in if (strcmp objmatstr.OML_sObjname objname) != 0 || (objmatstr.OML_bWhole != 1 && whole == 0 && objmatstr.OML_iMaterialId != idx) then nil else set isinlist = 1; set i = i + 1; ); if isinlist then setEdCtrlButtonEnable ctrlbtnaddobj 0 else setEdCtrlButtonEnable ctrlbtnaddobj 1; ); 0;; fun cbIdSelect(ctrlstr, pos, value, p)= let p -> [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj] in let getEdCtrlTextLineValue ctrlobjname -> objname in let getSelectedEdCtrlSelectPos ctrlidx -> idx in let getEdCtrlCheckState ctrlwhole -> whole in let 0 -> isinlist in ( let sizelist obstr.PMM_lObjectList -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.PMM_lObjectList i -> objmatstr in if (strcmp objmatstr.OML_sObjname objname) != 0 || (objmatstr.OML_bWhole != 1 && whole == 0 && objmatstr.OML_iMaterialId != idx) then nil else set isinlist = 1; set i = i + 1; ); if isinlist then setEdCtrlButtonEnable ctrlbtnaddobj 0 else setEdCtrlButtonEnable ctrlbtnaddobj 1; ); 0;; fun cbWholeObject(ctrlcheck, state, p)= let p -> [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj] in ( setEdCtrlSelectEnable ctrlidx !state; let getEdCtrlTextLineValue ctrlobjname -> objname in let getSelectedEdCtrlSelectPos ctrlidx -> idx in let getEdCtrlCheckState ctrlwhole -> whole in let 0 -> isinlist in ( if (objname == nil) || (strcmp objname "") == 0 then set isinlist = 1 else ( let sizelist obstr.PMM_lObjectList -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.PMM_lObjectList i -> objmatstr in if (strcmp objmatstr.OML_sObjname objname) != 0 || (objmatstr.OML_bWhole != 1 && whole == 0 && objmatstr.OML_iMaterialId != idx) then nil else set isinlist = 1; set i = i + 1; ); ); if isinlist then setEdCtrlButtonEnable ctrlbtnaddobj 0 else setEdCtrlButtonEnable ctrlbtnaddobj 1; ); ); 0;; fun loadMaterialsList(inst)= let 0 -> i in let nil -> lobjmat in let getPluginInstanceParam inst (strcat "object_" (itoa i)) -> objname in let atoi (getPluginInstanceParam inst (strcat "idx_" (itoa i))) -> idx in let atoi (getPluginInstanceParam inst (strcat "whole_" (itoa i))) -> whole in ( while (objname != nil) do ( let mkObjMatList[objname idx whole nil] -> objmat in let 0 -> j in let getPluginInstanceParam inst (strcatn "material_"::(itoa i)::"_"::(itoa j)::nil) -> mat in ( set lobjmat = objmat::lobjmat; while (mat != nil) do ( set objmat.OML_lMatlist = mat::objmat.OML_lMatlist; set j = j + 1; set mat = getPluginInstanceParam inst (strcatn "material_"::(itoa i)::"_"::(itoa j)::nil); ); set objmat.OML_lMatlist = revertlist objmat.OML_lMatlist; ); set i = i + 1; set objname = getPluginInstanceParam inst (strcat "object_" (itoa i)); set idx = atoi (getPluginInstanceParam inst (strcat "idx_" (itoa i))); set whole = atoi (getPluginInstanceParam inst (strcat "whole_" (itoa i))); ); revertlist lobjmat; );; fun dynamicedit(ewinstr, inst, viewstr, applybtn)= let [455 440] -> [iw ih] in let 10 -> ypos in ( setEdWindowSize ewinstr iw ih; let loadMaterialsList inst -> lobjmat in let getPluginInstanceParam inst "title" -> title in let if title == nil then "" else title -> title in let getPluginInstanceParam inst "okbutton" -> okbutton in let if okbutton == nil then "" else okbutton -> okbutton in let getPluginInstanceParam inst "cancelbutton" -> cancelbutton in let if cancelbutton == nil then "" else cancelbutton -> cancelbutton in let atoi (getPluginInstanceParam inst "init") -> init in let if init == nil then 0 else init -> init in let crEdFrameWindow _channel ewinstr 0 0 iw 135 EDWIN_RESIZE_MW nil (loc "OS3DMULTIMATLIST_0014") (loc "OS3DMULTIMATLIST_0005") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 110 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 (ypos + 2) 170 20 (loc "OS3DMULTIMATLIST_0007") nil -> labelobj in let crEdCtrlTextLine winstr 180 ypos (iw-10-180-65-25) 20 "" nil EDWIN_RESIZE_MW -> ctrlobjname in let crEdCtrlButton winstr 360 ypos 45 20 "..." nil -> pickbtn in let crEdCtrlButton winstr 410 ypos 35 20 "X" nil -> refreshobjname in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DMULTIMATLIST_0002") nil -> labelidx in let crEdCtrlSelect winstr 180 ypos (iw-10-180) 120 EDWIN_RESIZE_MW -> ctrlidx in let crEdCtrlCheck winstr 10 (set ypos = ypos + 25) 280 20 (loc "OS3DMULTIMATLIST_0004") EDWIN_RESIZE_MW -> ctrlwhole in let crEdCtrlButton winstr (iw / 4) (set ypos = ypos + 25) (iw / 2) 20 (loc "OS3DMULTIMATLIST_0015") EDWIN_RESIZE_MW -> ctrlbtnaddobj in let crEdFrameWindow _channel ewinstr 0 0 iw 195 EDWIN_RESIZE_MW nil (loc "OS3DMULTIMATLIST_0003") (loc "OS3DMULTIMATLIST_0006") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 170 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 150 20 (loc "OS3DMULTIMATLIST_0016") nil -> labelobjlist in let crEdCtrlSelect winstr 160 ypos (iw - 160 - 80) 120 EDWIN_RESIZE_MW -> ctrlobjlist in let crEdCtrlButton winstr (iw - 75) ypos 65 20 (loc "OS3DMULTIMATLIST_0017") EDWIN_RESIZE_MW -> ctrlbtnremove in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DMULTIMATLIST_0008") nil -> labelmat in let crEdCtrlList winstr 10 (set ypos = ypos + 25) (iw - 20) 80 LB_BORDER|LB_VSCROLL|ET_TABFOCUS EDWIN_RESIZE_MW|EDWIN_RESIZE_MH -> ctrlmatlist in let crEdCtrlSelect winstr 10 (set ypos = ypos + 85) (iw-10-60) 120 EDWIN_RESIZE_MW -> ctrlmatname in let crEdCtrlButton winstr (iw - 55) ypos 20 20 "+" EDWIN_RESIZE_MW -> ctrlbtnadd in let crEdCtrlButton winstr (iw - 30) ypos 20 20 "-" EDWIN_RESIZE_MW -> ctrlbtndel in let crEdFrameWindow _channel ewinstr 0 0 iw 110 EDWIN_RESIZE_MW nil (loc "OS3DMULTIMATLIST_0010") (loc "OS3DMULTIMATLIST_0005") -> winfrm in let crEdWindow _channel winfrm 0 18 iw 85 WN_CHILDINSIDE|WN_NOBORDER EDWIN_RESIZE_MW nil nil -> winstr in let crEdCtrlLabel winstr 10 ((set ypos = 10) + 2) 170 20 (loc "OS3DMULTIMATLIST_0011") nil -> labeltitle in let crEdCtrlTextLine winstr 180 ypos (iw-10-180) 20 title nil EDWIN_RESIZE_MW -> ctrltitle in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DMULTIMATLIST_0012") nil -> labelok in let crEdCtrlTextLine winstr 180 ypos (iw-10-180) 20 okbutton nil EDWIN_RESIZE_MW -> ctrlok in let crEdCtrlLabel winstr 10 ((set ypos = ypos + 25) + 2) 170 20 (loc "OS3DMULTIMATLIST_0013") nil -> labelcancel in let crEdCtrlTextLine winstr 180 ypos (iw-10-180) 20 cancelbutton nil EDWIN_RESIZE_MW -> ctrlcancel in let mkPlugMultiMatlist[lobjmat (hd lobjmat)] -> obstr in ( setEdCtrlButtonCb pickbtn mkfun2 @cbBtnPickObj [inst winstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlmatname]; setEdCtrlTextLineEnable ctrlobjname 0; setEdCtrlButtonCb refreshobjname mkfun2 @cbRefreshBtnSpec [ctrlobjname ctrlbtnaddobj]; setEdCtrlTextLineCbChange ctrlobjname mkfun3 @cbObjnameText [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj]; setEdCtrlSelectCb ctrlidx mkfun4 @cbIdSelect [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj]; setEdCtrlCheckCbState ctrlwhole mkfun3 @cbWholeObject [obstr ctrlobjname ctrlidx ctrlwhole ctrlbtnaddobj]; setEdCtrlButtonEnable ctrlbtnaddobj 0; setEdCtrlButtonCb ctrlbtnaddobj mkfun2 @cbAddObject [obstr viewstr ctrlobjname ctrlidx ctrlwhole ctrlobjlist ctrlmatlist ctrlmatname]; fillObjectList ctrlobjlist obstr; setEdCtrlSelectCb ctrlobjlist mkfun4 @cbSelectObjMatList [obstr viewstr ctrlmatlist ctrlmatname]; selectEdCtrlSelectByPos ctrlobjlist 0; fillEdCtrlList ctrlmatlist obstr.PMM_selected.OML_lMatlist; setEdCtrlButtonCb ctrlbtnremove mkfun2 @cbRemoveObject [obstr ctrlobjlist ctrlmatlist]; fillMaterialSelector viewstr ctrlmatname obstr; setEdCtrlButtonCb ctrlbtnadd mkfun2 @cbAddList [ctrlmatlist ctrlmatname]; setEdCtrlButtonCb ctrlbtndel mkfun2 @cbDelList [ctrlmatlist ctrlmatname]; [mkfun1 @cbCloseEdit [obstr ctrlmatlist ctrltitle ctrlok ctrlcancel] nil]; ); );;