/* ----------------------------------------------------------------------------- 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 ----------------------------------------------------------------------------- */ var GLBLL_xmargin = 5;; var GLBLL_ymargin = 3;; struct LabelStr = [ LBL_label : VUIcontainer, LBL_textElement : VUIelement, LBL_pos : [F F F], LBL_iIndex : I, LBL_sText : S, LBL_point : SO3_OBJECT, LBL_delButton : VUIelement, LBL_bShown : I ]mkLabelStr;; struct LabelListStr = [ LBLL_xmlFile : XMLfile, LBLL_lLabels : [LabelStr r1], LBLL_iIndexRef : I, LBLL_offset : [F F], LBLL_fScale : F, LBLL_iAlignFlags : I, LBLL_font : VUIfont, LBLL_iFontColor : I, LBLL_iBgColor : I, LBLL_bPointsShowState : I, LBLL_pointMat : SO3_MATERIAL, LBLL_iPointColor : I, LBLL_iClick : I, LBLL_bEditMode : I, LBLL_bAddNext : I, LBLL_fVisibilityDist : F, LBLL_bAutoScale : I, LBLL_fMaxAutoscaleDist : F, LBLL_bShowOnTop : I, LBLL_bAutosave : I ]mkLabelListStr;; var sLabelListPath = "tmp/labellist/";; fun deleteOb(inst, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in ( VUIdestroyContainer labelstr.LBL_label; SO3ObjectDestroy labelstr.LBL_point; ); set i = i + 1; ); XMLclose obstr.LBLL_xmlFile; SO3MaterialDestroy obstr.LBLL_pointMat; VUIdelFont obstr.LBLL_font; SO3GroupDelete (V3DgetSession c3dXsession) getPluginInstanceName inst; 0;; fun cbFocusTextElement(eltstr, state, p)= let p -> [inst obstr labelstr] in if (state == 1) then ( VUIset3DContainerMaxAutoScale labelstr.LBL_label 0.0; 0; ) else ( let XMLgetMarkByValue obstr.LBLL_xmlFile "labelList" -> labellistmark in let XMLgetMarkByParamValueFromMarkSons labellistmark "idx" (itoa labelstr.LBL_iIndex) -> labelmark in let VUIgetElementText eltstr -> text in ( set labelstr.LBL_sText = text; if labelmark != nil then ( XMLsetData labelmark text; 0; ) else ( let labelstr.LBL_pos -> [x y z] in XMLaddMark obstr.LBLL_xmlFile "label" labellistmark ["idx" (itoa labelstr.LBL_iIndex)]::["X" (ftoa x)]::["Y" (ftoa y)]::["Z" (ftoa z)]::nil text; 0; ); if (obstr.LBLL_bAutosave == 0) then nil else XMLwrite obstr.LBLL_xmlFile (strcatn sLabelListPath::(getShortName getPluginInstanceFullname inst)::".xml"::nil); ); VUIset3DContainerMaxAutoScale labelstr.LBL_label obstr.LBLL_fMaxAutoscaleDist; if (obstr.LBLL_bEditMode == 1) then nil else VUIsetContainerInputsEnable labelstr.LBL_label 0; 0; ); 0;; fun cbDelButton(eltstr, id, x, y, btn, p)= let p -> [inst obstr labelstr] in let XMLgetMarkByValue obstr.LBLL_xmlFile "labelList" -> labellistmark in let XMLgetMarkByParamValueFromMarkSons labellistmark "idx" (itoa labelstr.LBL_iIndex) -> labelmark in ( XMLdelMark obstr.LBLL_xmlFile labelmark; if (obstr.LBLL_bAutosave == 0) then nil else XMLwrite obstr.LBLL_xmlFile (strcatn sLabelListPath::(getShortName getPluginInstanceFullname inst)::".xml"::nil); VUIdestroyContainer labelstr.LBL_label; SO3ObjectDestroy labelstr.LBL_point; set obstr.LBLL_lLabels = remove_from_list obstr.LBLL_lLabels labelstr; ); 0;; fun createLabel(inst, pos, text, obstr)= let getPluginInstanceName inst -> iname in let VUIgetTextSize obstr.LBLL_font text 0 obstr.LBLL_iAlignFlags -> textsize in let if (textsize != nil) then textsize else [10 10] -> [tw th] in let VUIcreate3dContainer c3dXsession inst.INST_groupstr.GRP_project.PRJ_vuiGroup pos obstr.LBLL_offset [(itof (tw + 2 * GLBLL_xmargin)) (itof (th + 2 * GLBLL_ymargin))] obstr.LBLL_fScale obstr.LBLL_bAutoScale obstr.LBLL_fMaxAutoscaleDist 1 100 obstr.LBLL_bShowOnTop -> newLabel in let VUIcreateEditText newLabel nil [0.0 0.0] [100.0 100.0] [0 0 1 1 0 0 0 0] [0 1] obstr.LBLL_font [5 5] text 1 -> textElement in let obstr.LBLL_iIndexRef -> index in let SO3OctahedronCreate (V3DgetSession c3dXsession) iname (strcatn iname::"_point_"::(itoa index)::nil) 0.14 0.1 0.1 -> newPoint in let mkLabelStr [newLabel textElement pos index text newPoint nil 1] -> labelstr in ( set obstr.LBLL_iIndexRef = obstr.LBLL_iIndexRef + 1; VUIsetContainerBackground newLabel obstr.LBLL_iBgColor nil nil nil nil 0 1 0; VUIsetElementText textElement VUIcreateFontInterface obstr.LBLL_font text [0 0] [0 0] [5 5] obstr.LBLL_iAlignFlags VUI_TextAuto 1; VUIsetElementResource textElement nil nil nil nil nil nil nil nil nil; VUIsetElementCbFocused textElement mkfun3 @cbFocusTextElement [inst obstr labelstr]; VUIshowContainer newLabel 1; VUIsetContainerInputsEnable newLabel 0; SO3ObjectSetGlobalPosition newPoint pos; SO3ObjectSetCastShadows newPoint 0; SO3EntitySetMaterial newPoint obstr.LBLL_pointMat 0; SO3ObjectSetMouseForeGround newPoint obstr.LBLL_bShowOnTop; SO3ObjectSetRenderQueue newPoint if (!obstr.LBLL_bShowOnTop) then 50 else 69; if obstr.LBLL_bEditMode == 0 then nil else ( set labelstr.LBL_delButton = VUIcreateButton labelstr.LBL_label nil [5.0 5.0] [16.0 16.0] [0 0 0 0 0 0 0 0] [2 0]; let strcat (getPluginDirectory (getInstancePlugin inst)) "/res/closebtn.png" -> btnpath in VUIsetElementResource labelstr.LBL_delButton nil nil nil (_checkpack btnpath) nil nil nil nil nil; VUIsetElementCbClick labelstr.LBL_delButton mkfun6 @cbDelButton [inst obstr labelstr]; ); labelstr; );; fun showLabel(labelstr)= VUIshowContainer labelstr.LBL_label 1; set labelstr.LBL_bShown = 1; 0;; fun hideLabel(labelstr)= VUIshowContainer labelstr.LBL_label 0; set labelstr.LBL_bShown = 0; 0;; fun cbPostRender(inst, viewstr, obstr)= let V3DgetSessionView c3dXsession -> viewstr in let V3DgetDefaultViewport viewstr -> viewportstr in let V3DgetViewportSize viewstr viewportstr -> [_ _ _ vh] in let if (vh <= 0) then 1 else if (viewstr.V3D_bVRmode) then iVUIBASEVRHEIGHT else vh -> vh in let V3DgetViewportCamera viewportstr -> cam in let V3DgetOrthographicMode cam -> ortho in let if ortho then V3DgetOrthographicScale cam else 0.0 -> cscale in let if (viewstr.V3D_bVRmode) then SO3MathsDegreeToRadian iVUIBASEVRFOV else (SO3CameraGetFOVy cam) -> fovy in let if ((fovy <=. 0.0) || ortho) then 1.0 else fovy -> fovy in let SO3ObjectGetGlobalPosition cam -> campos in let SO3ObjectGetGlobalOrientation cam -> quat in let 80.0 -> scalecoef in let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in ( // update label size let labelstr.LBL_textElement.VUIE_Text.VUIT_tTextSize -> textsize in let if (textsize != nil) then textsize else [30 30] -> [tw th] in let [(max tw 30) (max th 30)] -> [tw th] in let if obstr.LBLL_bEditMode then tw + 21 else tw -> tw in VUIsetContainerSize labelstr.LBL_label [(itof tw + 2 * GLBLL_xmargin) (itof th + 2 * GLBLL_ymargin)] nil; // update points let if (cscale != 0.0) then cscale *. scalecoef else if (viewstr.V3D_bVRmode) then (getVectorDistanceF labelstr.LBL_pos campos) *. scalecoef else let normalizeVectorF (SO3MathsQuatGetDirection quat [0.0 0.0 (-.1.0)]) -> dir in (dotVectorF (subVectorF labelstr.LBL_pos campos) dir) *. scalecoef -> dist in let maxf 0.000001 ((dist /. ((itof vh) /. 2.0)) *. fovy) /. 2.0 -> cdist in let obstr.LBLL_fScale *. (if (viewstr.V3D_bVRmode) then 0.8 else 0.6) -> maxscale in let getVectorDistanceF campos labelstr.LBL_pos -> ccdist in let if ((obstr.LBLL_fVisibilityDist != 0.0) && (ccdist >=. obstr.LBLL_fVisibilityDist)) then 0 else 1 -> state in ( if ((cdist >. maxscale) && ((VUIget3DContainerMaxAutoScale labelstr.LBL_label) != 0.0)) then SO3ObjectSetScale labelstr.LBL_point [maxscale maxscale maxscale] else SO3ObjectSetScale labelstr.LBL_point [cdist cdist cdist]; if (!labelstr.LBL_bShown) then nil else VUIset3DContainerVisible labelstr.LBL_label state; if (!obstr.LBLL_bPointsShowState) then nil else SO3ObjectSetVisible labelstr.LBL_point state 1; ); ); set i = i + 1; ); 0;; proto cbInputClick = fun [PInstance V3Dview I I I I [SO3_OBJECT SO3_MATERIAL I [F F F] [F F] F] LabelListStr] I;; fun cbInputClick(inst, viewstr, id, x, y, btn, pdata, obstr)= let pdata -> [obj mat _ dvec _ _] in if (obstr.LBLL_bAddNext) then ( let (SO3ObjectGetFlags obj) -> obflag in if ((obflag & iNodeFlagController) || (obflag & iNodeFlagVUI) || (obflag & iNodeFlagTools)) then nil else ( let createLabel inst dvec "Note" obstr -> labelstr in let XMLgetMarkByValue obstr.LBLL_xmlFile "labelList" ->labellistmark in let labelstr.LBL_iIndex -> index in ( VUIsetFocusedContainer labelstr.LBL_label; VUIsetFocusedElement labelstr.LBL_label labelstr.LBL_textElement; VUIsetContainerInputsEnable labelstr.LBL_label 1; VUIset3DContainerMaxAutoScale labelstr.LBL_label 0.0; set obstr.LBLL_lLabels = labelstr::obstr.LBLL_lLabels; //force update to avoid strange flash on create cbPostRender inst viewstr obstr; ); if (obstr.LBLL_iClick == 1) || ((obstr.LBLL_iClick == 3) && obstr.LBLL_bEditMode) then setPluginInstanceCbInputClick inst mkfun8 @cbInputClick obstr else setPluginInstanceCbInputClick inst nil; ); set obstr.LBLL_bAddNext = 0; ) else ( let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in if ((btn != 1) || (labelstr.LBL_point != obj) || (obstr.LBLL_pointMat != mat)) then nil else ( if labelstr.LBL_bShown == 0 then showLabel labelstr else hideLabel labelstr; ); set i = i + 1; ); 0; ); 0;; fun cbDbClick(inst, viewstr, x, y, btn, obstr)= let V3DgetLastMouseData viewstr 0 -> [_ _ obj mat _ _ _ _ _] in let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in if ((btn != 1) || (labelstr.LBL_point != obj) || (obstr.LBLL_pointMat != mat)) then nil else ( if labelstr.LBL_bShown == 0 then showLabel labelstr else hideLabel labelstr; ); set i = i + 1; ); 0;; fun cbInputUpdate(inst, viewstr, id, x, y, btn, pdata, obstr)= let pdata -> [obj mat _ _ _ _] in let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in if ((labelstr.LBL_point != obj) || (obstr.LBLL_pointMat != mat)) then ( if labelstr.LBL_bShown == 0 then nil else hideLabel labelstr; ) else ( if labelstr.LBL_bShown == 1 then nil else showLabel labelstr; ); set i = i + 1; ); 0;; fun cbShowLabels(inst, from, action, param, reply, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in showLabel labelstr; set i = i + 1; ); //force update to avoid strange flash on create let V3DgetSessionView c3dXsession -> viewstr in cbPostRender inst viewstr obstr; SendPluginEvent inst "Shown" nil nil; 0;; fun cbHideLabels(inst, from, action, param, reply, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in hideLabel labelstr; set i = i + 1; ); SendPluginEvent inst "Hidden" nil nil; 0;; fun cbShowPoints(inst, from, action, param, reply, obstr)= set obstr.LBLL_bPointsShowState = 1; let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in SO3ObjectSetVisible labelstr.LBL_point 1 1; set i = i + 1; ); if (obstr.LBLL_iClick == 1) then ( setPluginInstanceCbInputClick inst mkfun8 @cbInputClick obstr; 0; ) else if (obstr.LBLL_iClick == 2) then ( setPluginInstanceCbDbClick inst mkfun6 @cbDbClick obstr; 0; ) else if (obstr.LBLL_iClick == 3) then ( setPluginInstanceCbInputUpdate inst mkfun8 @cbInputUpdate obstr; 0; ) else nil; 0;; fun cbHidePoints(inst, from, action, param, reply, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in SO3ObjectSetVisible labelstr.LBL_point 0 1; set i = i + 1; ); setPluginInstanceCbInputClick inst nil; setPluginInstanceCbInputUpdate inst nil; setPluginInstanceCbDbClick inst nil; set obstr.LBLL_bPointsShowState = 0; 0;; fun cbDisableEditMode(inst, from, action, param, reply, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in ( VUIsetContainerInputsEnable labelstr.LBL_label 0; VUIset3DContainerMaxAutoScale labelstr.LBL_label obstr.LBLL_fMaxAutoscaleDist; VUIdestroyElement labelstr.LBL_delButton; set labelstr.LBL_delButton = nil; ); set i = i + 1; ); VUIsetFocusedContainer nil; VUIsetFocusedElement nil nil; set obstr.LBLL_bEditMode = 0; if (obstr.LBLL_iClick != 3) then nil else ( setPluginInstanceCbInputClick inst nil; setPluginInstanceCbInputUpdate inst mkfun8 @cbInputUpdate obstr; ); SendPluginEvent inst "Edit mode disabled" nil nil; 0;; fun cbEnableEditMode(inst, from, action, param, reply, obstr)= let sizelist obstr.LBLL_lLabels -> size in let 0 -> i in while (i < size) do ( let nth_list obstr.LBLL_lLabels i -> labelstr in ( VUIsetContainerInputsEnable labelstr.LBL_label 1; if (labelstr.LBL_delButton != nil) then nil else ( set labelstr.LBL_delButton = VUIcreateButton labelstr.LBL_label nil [5.0 5.0] [16.0 16.0] [0 0 0 0 0 0 0 0] [2 0]; let strcat (getPluginDirectory (getInstancePlugin inst)) "/res/closebtn.png" -> btnpath in VUIsetElementResource labelstr.LBL_delButton nil nil nil (_checkpack btnpath) nil nil nil nil nil; VUIsetElementCbClick labelstr.LBL_delButton mkfun6 @cbDelButton [inst obstr labelstr]; ); ); set i = i + 1; ); set obstr.LBLL_bEditMode = 1; if (obstr.LBLL_iClick != 3) then nil else ( setPluginInstanceCbInputUpdate inst nil; setPluginInstanceCbInputClick inst mkfun8 @cbInputClick obstr; 0; ); SendPluginEvent inst "Edit mode enabled" nil nil; 0;; fun cbAddLabelOnNextClick(inst, from, action, param, reply, obstr)= set obstr.LBLL_bAddNext = 1; setPluginInstanceCbInputClick inst mkfun8 @cbInputClick obstr; 0;; fun cbAddLabel(inst, from, action, param, reply, obstr)= if (!strcmp "" (strtrim param)) || param == nil then nil else ( let strextr param -> lp in let [(atof (nth_list (hd lp) 0)) (atof (nth_list (hd lp) 1)) (atof (nth_list (hd lp) 2))] -> pos in let strtrim strbuild tl lp -> text in let if (!strcmp "" text) || text == nil then "" else text -> text in ( let createLabel inst pos text obstr -> labelstr in let XMLgetMarkByValue obstr.LBLL_xmlFile "labelList" ->labellistmark in let labelstr.LBL_iIndex -> index in let pos -> [x y z] in ( //VUIsetFocusedContainer labelstr.LBL_label; //VUIsetFocusedElement labelstr.LBL_label labelstr.LBL_textElement; set obstr.LBLL_lLabels = labelstr::obstr.LBLL_lLabels; XMLaddMark obstr.LBLL_xmlFile "label" labellistmark ["idx" (itoa index)]::["X" (ftoa x)]::["Y" (ftoa y)]::["Z" (ftoa z)]::nil text; if (obstr.LBLL_bAutosave == 0) then nil else XMLwrite obstr.LBLL_xmlFile (strcatn sLabelListPath::(getShortName getPluginInstanceFullname inst)::".xml"::nil); ); //force update to avoid strange flash on create let V3DgetSessionView c3dXsession -> viewstr in cbPostRender inst viewstr obstr; ); ); 0;; fun cbSave(inst, from, action, param, reply, obstr)= XMLwrite obstr.LBLL_xmlFile (strcatn sLabelListPath::(getShortName getPluginInstanceFullname inst)::".xml"::nil); 0;; fun getHalign(mode)= if (mode == 1) then iVUITEXT_HALIGNCENTER else if (mode == 2) then iVUITEXT_HALIGNRIGHT else iVUITEXT_HALIGNLEFT;; fun crMaterial(name, group, color, showontop)= let SO3MaterialCreate (V3DgetSession c3dXsession) name group -> mat in ( SO3MaterialSetReceiveShadows mat 0; SO3MaterialSetIgnoreSlicePlane mat 1; if (showontop == 0) then nil else ( SO3MaterialSetPassDepthFunction mat 0 0 SO3_COMPARE_FUNCTION_ALWAYS_PASS; SO3MaterialSetPassDepthWriteEnabled mat 0 0 0; ); SO3MaterialSetAmbient mat color; SO3MaterialSetDiffuse mat color; SO3MaterialSetSelfIllumination mat color; SO3MaterialSetSpecular mat color; SO3MaterialSetShininess mat 128.0; SO3MaterialSetPassSceneBlending mat 0 0 SO3_SCENE_BLEND_FACTOR_SOURCE_ALPHA SO3_SCENE_BLEND_FACTOR_ONE_MINUS_SOURCE_ALPHA nil nil; mat; );; fun cbNewOb(inst)= let getPluginInstanceName inst -> iname in let atof (getPluginInstanceParam inst "xoffset") -> xoffset in let if xoffset == nil then 0.5 else xoffset -> xoffset in let atof (getPluginInstanceParam inst "yoffset") -> yoffset in let if yoffset == nil then 0.5 else yoffset -> yoffset in let atof (getPluginInstanceParam inst "scale") -> scale in let if scale == nil then 1.0 else scale -> scale in let atoi (getPluginInstanceParam inst "fontsize") -> fsize in let if fsize == nil then 12 else fsize -> fsize in let atoi (getPluginInstanceParam inst "fontcolor") -> fcolor in let if fcolor == nil then 0xffffff else fcolor -> fcolor in let atoi (getPluginInstanceParam inst "backgroundcolor") -> bcolor in let if bcolor == nil then 80 else bcolor -> bcolor in let atoi (getPluginInstanceParam inst "horalign") -> halign in let if halign == nil then BT_TEXT_HORIZ_CENTERED else getHalign halign -> halign in let getPluginInstanceParam inst "text" -> text in let if text == nil then "" else text -> text in let atoi (getPluginInstanceParam inst "pointcolor") -> pcolor in let if pcolor == nil then 80 else pcolor -> pcolor in let atoi (getPluginInstanceParam inst "pointclick") -> click in let if click == nil then 0 else click -> click in let atoi (getPluginInstanceParam inst "point") -> point in let if point == nil then 0 else point -> point in let atof (getPluginInstanceParam inst "visibility") -> visibility in let if visibility == nil then 0.0 else visibility -> visibility in let atoi (getPluginInstanceParam inst "autoscale") -> autoscale in let if autoscale == nil then 1 else autoscale -> autoscale in let atof (getPluginInstanceParam inst "maxautoscaledist") -> maxautoscaledist in let if maxautoscaledist == nil then 5.0 else maxautoscaledist -> maxautoscaledist in let atoi (getPluginInstanceParam inst "showontop") -> showontop in let if showontop == nil then 1 else showontop -> showontop in let atoi (getPluginInstanceParam inst "autosave") -> autosave in let if autosave == nil then 1 else autosave -> autosave in let atoi (getPluginInstanceParam inst "init") -> init in let if init == nil then 1 else init -> init in let strcatn sLabelListPath::(getShortName getPluginInstanceFullname inst)::".xml"::nil -> filepath in let strcatn sLabelListPath::(getPluginInstanceName inst)::".xml"::nil -> filepathold in let if (((_checkpack filepath) == nil) && ((_checkpack filepathold) != nil)) then filepathold else filepath -> filepath in let XMLload filepath -> xmlfile in let XMLloadString webtostr (getPluginInstanceParam inst "xmldata") -> xmldata in let if xmlfile != nil then xmlfile else (XMLwrite xmldata filepath; XMLload filepath;) -> xmlfile in let VUIcreateFont "Sans" fsize 0 fcolor 1 -> font in let mkLabelListStr[xmlfile nil 0 [xoffset yoffset] scale halign font fcolor bcolor point nil pcolor click 0 0 visibility autoscale maxautoscaledist showontop autosave] -> obstr in ( SO3GroupCreate (V3DgetSession c3dXsession) iname; set obstr.LBLL_pointMat = crMaterial (strcat iname ".point_material") iname obstr.LBLL_iPointColor obstr.LBLL_bShowOnTop; if (xmlfile == nil) then nil else ( let 0 -> maxIndex in let XMLgetMarkByValue xmlfile "labelList" -> labellistmark in let if labellistmark != nil then labellistmark else XMLaddMark xmlfile "labelList" nil nil nil -> labellistmark in let XMLgetMarksByValueFromMarkSons labellistmark "label" -> labelmarks in let sizelist labelmarks -> size in let 0 -> i in while (i < size) do ( let nth_list labelmarks i -> labelmark in let [atof(XMLgetParam labelmark "X") atof(XMLgetParam labelmark "Y") atof(XMLgetParam labelmark "Z")] -> pos in ( set obstr.LBLL_iIndexRef = atoi (XMLgetParam labelmark "idx"); let XMLgetData labelmark -> value in let if ((value == nil) || ((strlen value) == 0)) then "Note" else value -> value in let createLabel inst pos value obstr -> labelstr in set obstr.LBLL_lLabels = labelstr::obstr.LBLL_lLabels; ); if (obstr.LBLL_iIndexRef > maxIndex) then set maxIndex = obstr.LBLL_iIndexRef else set obstr.LBLL_iIndexRef = maxIndex; set i = i + 1; ); ); if (init == 1 && click != 3) then nil else cbHideLabels inst nil nil nil nil obstr; if (point == 0) then cbHidePoints inst nil nil nil nil obstr else cbShowPoints inst nil nil nil nil obstr; setPluginInstanceCbPostRender inst mkfun3 @cbPostRender obstr; PluginRegisterAction inst "Add label" mkfun6 @cbAddLabel obstr; PluginRegisterAction inst "Add label on next click" mkfun6 @cbAddLabelOnNextClick obstr; PluginRegisterAction inst "Enable edit mode" mkfun6 @cbEnableEditMode obstr; PluginRegisterAction inst "Disable edit mode" mkfun6 @cbDisableEditMode obstr; PluginRegisterAction inst "Show labels" mkfun6 @cbShowLabels obstr; PluginRegisterAction inst "Hide labels" mkfun6 @cbHideLabels obstr; PluginRegisterAction inst "Show points" mkfun6 @cbShowPoints obstr; PluginRegisterAction inst "Hide points" mkfun6 @cbHidePoints obstr; PluginRegisterAction inst "Save" mkfun6 @cbSave obstr; setPluginInstanceCbDel inst mkfun2 @deleteOb obstr; ); 0;; fun IniPlug(file) = VUIsetEnable c3dXsession 1; PlugRegister @cbNewOb nil; setPluginEditor @dynamicedit; 0;;