示例#1
0
        private static uint AssignHandles(IDxfItemInternal item, uint nextHandle, uint ownerHandle, HashSet <IDxfItemInternal> visitedItems)
        {
            if (item == null || !visitedItems.Add(item))
            {
                return(nextHandle);
            }

            Debug.Assert(item.Handle == 0u);
            item.Handle = nextHandle++;
            if (item.OwnerHandle == 0u && ownerHandle != 0u)
            {
                item.OwnerHandle = ownerHandle;
            }

            foreach (var child in item.GetPointers().Where(c => c.Item != null))
            {
                var childItem    = (IDxfItemInternal)child.Item;
                var parentHandle = GetParentHandle(item, childItem);
                nextHandle            = AssignHandles(childItem, nextHandle, parentHandle, visitedItems);
                child.Handle          = childItem.Handle;
                childItem.OwnerHandle = parentHandle;
            }

            return(nextHandle);
        }
示例#2
0
        private static void SetOwner(IDxfItemInternal item, IDxfItemInternal owner, bool isWriting)
        {
            if (item != null && owner != null)
            {
                if (isWriting && item is DxfEntity && !(owner is DxfDictionary))
                {
                    // entities can only be parented by a dictionary
                    return;
                }

                item.SetOwner(owner);
                var hasXData = item as IDxfHasXData;
                if (hasXData != null)
                {
                    var reactors = hasXData.ExtensionDataGroups.FirstOrDefault(e => e.GroupName == "ACAD_REACTORS");
                    if (reactors != null)
                    {
                        foreach (var pair in reactors.Items)
                        {
                            SetOwnerPair(pair, owner);
                        }
                    }
                }
            }
        }
示例#3
0
        private static uint GetParentHandle(IDxfItemInternal parent, IDxfItemInternal child)
        {
            if (child is DxfEntity && !(parent is DxfDictionary))
            {
                // entities can only be parented by a dictionary
                return(0u);
            }

            return(parent.Handle);
        }
示例#4
0
 private static void SetChildOwners(IDxfItemInternal item, HashSet <IDxfItemInternal> visitedChildren)
 {
     foreach (var child in item.GetChildItems())
     {
         if (child != null && visitedChildren.Add(child))
         {
             SetOwner(child, item, isWriting: false);
             SetChildOwners(child, visitedChildren);
         }
     }
 }
示例#5
0
 private static void ClearPointers(IDxfItemInternal item, HashSet <IDxfItemInternal> visitedItems)
 {
     if (item != null && visitedItems.Add(item))
     {
         item.Handle = 0u;
         foreach (var child in item.GetChildItems())
         {
             ClearPointers(child, visitedItems);
         }
     }
 }
示例#6
0
        private static void GatherPointers(IDxfItemInternal item, Dictionary <uint, IDxfItemInternal> handleMap, HashSet <IDxfItemInternal> visitedItems)
        {
            if (item != null && visitedItems.Add(item))
            {
                if (item.Handle != 0u)
                {
                    handleMap[item.Handle] = item;
                }

                foreach (var child in item.GetChildItems())
                {
                    GatherPointers(child, handleMap, visitedItems);
                }
            }
        }
示例#7
0
 private static void SetOwnerPair(IDxfCodePairOrGroup codePairOrGroup, IDxfItemInternal owner)
 {
     if (codePairOrGroup.IsCodePair)
     {
         var pair = (DxfCodePair)codePairOrGroup;
         if (pair.Code == 330)
         {
             pair.Value = DxfCommonConverters.UIntHandle(owner.Handle);
         }
     }
     else
     {
         foreach (var item in ((DxfCodePairGroup)codePairOrGroup).Items)
         {
             SetOwnerPair(item, owner);
         }
     }
 }
示例#8
0
        private static void BindPointers(IDxfItemInternal item, Dictionary <uint, IDxfItemInternal> handleMap, HashSet <IDxfItemInternal> visitedItems, HashSet <IDxfItemInternal> visitedChildren)
        {
            if (visitedItems.Add(item))
            {
                // set initial owners
                SetChildOwners(item, visitedChildren);

                // set explicit owners
                foreach (var child in item.GetPointers())
                {
                    if (handleMap.ContainsKey(child.Handle))
                    {
                        child.Item = handleMap[child.Handle];
                        BindPointers((IDxfItemInternal)child.Item, handleMap, visitedItems, visitedChildren);
                        SetOwner((IDxfItemInternal)child.Item, item, isWriting: false);
                    }
                }
            }
        }