internal PlacementsConfig.Config GetCfg() { var cfg = new PlacementsConfig.Config(); cfg.BaseEditorPath = (BaseEditorPath != null) ? GetBaseUri().MakeRelativeUri(BaseEditorPath).ToString() : ""; var cellCount = CellCount; if (cellCount[0] > 0 && cellCount[1] > 0) { cfg.CellCountX = (uint)cellCount[0]; cfg.CellCountY = (uint)cellCount[1]; } var cellsOrigin = CellsOrigin; cfg.CellsOriginX = cellsOrigin[0]; cfg.CellsOriginY = cellsOrigin[1]; cfg.CellSize = GetAttribute <float>(FolderST.CellSizeAttribute); return(cfg); }
internal PlacementsConfig.Config GetCfg() { var cfg = new PlacementsConfig.Config(); cfg.BaseEditorPath = BaseEditorPath; cfg.BaseExportPath = BaseExportPath; var cellCount = CellCount; if (cellCount[0] > 0 && cellCount[1] > 0) { cfg.CellCountX = (uint)cellCount[0]; cfg.CellCountY = (uint)cellCount[1]; } var cellsOrigin = CellsOrigin; cfg.CellsOriginX = cellsOrigin[0]; cfg.CellsOriginY = cellsOrigin[1]; cfg.CellSize = GetAttribute <float>(FolderST.CellSizeAttribute); return(cfg); }
internal void Reconfigure(PlacementsConfig.Config cfg) { // Based on the configuration settings given, remove and attach // cell references. First create a list of all of the references // we want to see. // We can use this to filter out the existing references that should // be removed. // Then, we should create new references for all new cells that have // been added. // Cells always have the same basic filename structure, and are // arranged in a dense 2d grid. The filenames contain the x and y // coordinates of the cell in that grid. BaseEditorPath = new Uri(GetBaseUri(), cfg.BaseEditorPath); SetAttribute(FolderST.CellCountAttribute, new int[2] { (int)cfg.CellCountX, (int)cfg.CellCountY }); SetAttribute(FolderST.CellSizeAttribute, cfg.CellSize); SetAttribute(FolderST.CellsOriginAttribute, new float[2] { cfg.CellsOriginX, cfg.CellsOriginY }); var newCells = new List <Tuple <Uri, string, Vec3F, Vec3F> >(); var cellCount = CellCount; for (uint y = 0; y < cellCount[1]; ++y) { for (uint x = 0; x < cellCount[0]; ++x) { var rf = String.Format("p{0,3:D3}_{1,3:D3}.plcdoc", x, y); var name = String.Format("{0,2:D2}-{1,2:D2}", x, y); var mins = new Vec3F(x * cfg.CellSize + cfg.CellsOriginX, y * cfg.CellSize + cfg.CellsOriginY, -5000.0f); var maxs = new Vec3F((x + 1) * cfg.CellSize + cfg.CellsOriginX, (y + 1) * cfg.CellSize + cfg.CellsOriginY, 5000.0f); newCells.Add(Tuple.Create(new Uri(BaseEditorPath, rf), name, mins, maxs)); } } var foundMatching = new bool[newCells.Count]; Array.Clear(foundMatching, 0, foundMatching.Length); var toBeRemoved = new List <PlacementsCellRef>(); var existingRefs = Cells; foreach (var r in existingRefs) { var rawRef = r.Uri; int index = newCells.FindIndex(0, newCells.Count, s => s.Item1.Equals(rawRef)); if (index >= 0) { foundMatching[index] = true; r.Name = newCells[index].Item2; r.CaptureMins = newCells[index].Item3; r.CaptureMaxs = newCells[index].Item4; } else { toBeRemoved.Add(r); } } // \todo -- if we have some cell references to be removed, we should first check if there // are any changes, and if they need to be saved! foreach (var r in toBeRemoved) { r.Unresolve(); r.DomNode.RemoveFromParent(); } // Create the new cell references that are needed... var childList = DomNode.GetChildList(Schema.placementsFolderType.cellChild); for (int c = 0; c < newCells.Count; ++c) { if (!foundMatching[c]) { var newItem = PlacementsCellRef.Create( cfg.UnnamedPlacementDocuments ? null : newCells[c].Item1, newCells[c].Item2, newCells[c].Item3, newCells[c].Item4); childList.Add(newItem); newItem.As <PlacementsCellRef>().CreateAndResolve(); } } }