Hi Unity Community
I am using the generic dictionary to store a string [key] and a float [value], however I can’t seem to access it the float value by passing the string key.
I am sure the float values are present as they return properly when iterated over using the the key value pairs, so I must be trying to access the value wrong; can anyone enlighten me as to where this issue may be occurring?
Have tried a whole number of approaches available in reference documentation to no avail.
Many thanks in advance,
Ryan
Dictionary declaration:
groupingsOrigin = new Dictionary.<String, float>();
for (var group : String in groupings)
{
var subDivLength = floorSizeX - floorSubdivisionSize;
floorSizeX -= floorSubdivisionSize;
var subDivXOrigin = subDivLength + (floorSubdivisionSize/2);
groupingsOrigin.Add(group, subDivXOrigin);
}
Debugs correct:
for (var group : KeyValuePair.<String, float> in groupingsOrigin)
{
var groupOrigin = groupingsOrigin.Values;
Debug.Log("Dictionary entry= " + " Group Name: " +group.Key + " " + " Group X Origin: " + group.Value);
}
**Value retrieval issue: ** (‘curSortField’ being synonymous w/ the key string)
var curObjXPos : float = groupingsOrigin[curSortField]; //value of objSort dict matches the key of the groupingsOrigin dict
// var curObjXPos : float;
// groupingsOrigin.TryGetValue(curSortField, curObjXPos);
Issue returns:
CurObj moving to: CompilerGenerated.__BrowseImpSortPositionObj_positionObjects$callable1$137_61__
UnityEngine.Debug:Log(Object)
BrowseImpSortPositionObj:positionObjects(Dictionary`2) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:137)
BrowseImpSortPositionObj:getPhotogramLocations(List`1) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:83)
BrowseImpSortPositionObj:sortMode(List`1) (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImpSortPositionObj.js:39)
$:MoveNext() (at Assets/Scripts/MetaPipe_SceneBrowseScripts/BrowseImportObj.js:132)
Question Update
Full script being used:
#pragma strict
//function used to sort imported objs by their sort field and position them in groups
import System.Linq;
import System.Xml;
import System.Collections.Generic;
var infoCont : ObjInfoControl;
//xml declarations
var xmlRoot : XmlNode;
//gui dependancies
var photogramLocationToggle : Toggle;
var floorPlane : GameObject; //floorplane objects sit on
var curPosObjects : List.<GameObject>;
var groupingsOrigin = Dictionary.<String, float>();
function sortMode(curBrowseObjects : List.<GameObject>) //determines what sort of sorting is requried
{
curPosObjects = curBrowseObjects;
if (photogramLocationToggle.isOn)
{
getPhotogramLocations(curPosObjects);
}
}
//Photogram etc might need their own script
function getPhotogramLocations (curPosObjects : List.<GameObject>) //used to determine number of locations in browse results
{
xmlRoot = infoCont.control.root;
var curObjName : String;
var objectPhotogramLocations : List.<String> = new List.<String>(); //will be used to count up number of locations in browse results
var objectLocationsDict = new Dictionary.<GameObject, String>();
Debug.Log("Positioning now");
for (var object : Object in curPosObjects)
{
var curObject = object as GameObject;
curObjName = curObject.name;
Debug.Log("Positioning: " + curObjName);
var curObjNode = xmlRoot.SelectSingleNode("MetaPipeObject[@name='"+ curObjName +"']");
var curLocationName = curObjNode.SelectSingleNode("./ModelInfo/PhotogramInfo/PhotogramLocation/PhotogramLocationName").InnerText;
Debug.Log(curObjName + " location: " + curLocationName);
objectLocationsDict.Add(curObject, curLocationName);
if (!objectPhotogramLocations.Contains(curLocationName)) //will only add location name to list if it doesn't already exist
{
objectPhotogramLocations.Add(curLocationName);
}
}
//sort the photogram groups reverse alphabetically to match origin calculations
objectPhotogramLocations = objectPhotogramLocations.OrderByDescending(function(curObjName) curObjName).ToList();
var photogramLocationCount : int = objectPhotogramLocations.Count;
Debug.Log("Total number of locations: " + photogramLocationCount);
findXOrigin(photogramLocationCount, objectPhotogramLocations); //find floor allocations for the individual groupings
positionObjects(objectLocationsDict); //move the objects into position
}
function findXOrigin(numberOfGroupings : int, groupings : List.<String>)
{
var floorPlaneCol = floorPlane.GetComponent(BoxCollider);
var floorSizeX = floorPlaneCol.size.x;
Debug.Log("floorSizeX: " + floorSizeX);
var floorSubdivisionSize = floorSizeX / numberOfGroupings;
Debug.Log("floorSubdivisionSize: " + floorSubdivisionSize);
groupingsOrigin = new Dictionary.<String, float>();
for (var group : String in groupings)
{
var subDivLength = floorSizeX - floorSubdivisionSize;
floorSizeX -= floorSubdivisionSize; //removes accounted for section from the overall size
var subDivXOrigin = subDivLength + (floorSubdivisionSize/2);
groupingsOrigin.Add(group, subDivXOrigin);
}
//Accessing values example
for (var group : KeyValuePair.<String, float> in groupingsOrigin)
{
var groupOrigin = groupingsOrigin.Values;
Debug.Log("Dictionary entry= " + " Group Name: " +group.Key + " " + " Group X Origin: " + group.Value);
}
for (var group : String in groupingsOrigin.Keys)
{
var groupOriginX = groupingsOrigin[group];
Debug.Log("Dictionary entry= " + " Group Name: " + group + " " + " Group X Origin: " + groupOriginX.ToString);
}
}
function positionObjects(objectSortDict : Dictionary.<GameObject, String>)
{
//assigns rb/coll components and moves objects into position
//var groupingsOrigin = Dictionary.<String, float>()
for (var browseObj : KeyValuePair.<GameObject, String> in objectSortDict)
{
var curObj : GameObject = browseObj.Key;
var curSortField : String = browseObj.Value;
Debug.Log("Dictionary entry= " + " Object Name: " + curObj.name + " " + " Location: " + curSortField);
var curObjXPos : float = groupingsOrigin[curSortField]; //value of objSort dict matches the key of the groupingsOrigin dict
// var curObjXPos : float;
// groupingsOrigin.TryGetValue(curSortField, curObjXPos);
curObj.transform.position.x = curObjXPos;
Debug.Log("CurObj moving to: " + curObjXPos.ToString);
}
}