Esempio n. 1
0
        internal override int ReadParameters(List <string> parameters, IgesReaderBinder binder)
        {
            var index          = 0;
            var stack          = new Stack <object>();
            var parameterCount = Integer(parameters, index++);

            for (int i = 0; i < parameterCount; i++)
            {
                var value = Integer(parameters, index++);
                if (value < 0)
                {
                    // negative index
                    stack.Push(-value);
                }
                else if (value > 0)
                {
                    // operation
                    var node      = new IgesBooleanTreeOperation((IgesBooleanTreeOperationKind)value);
                    var rightItem = stack.Pop();
                    var leftItem  = stack.Pop();

                    if (rightItem is int)
                    {
                        binder.BindEntity((int)rightItem, e => node.RightChild = new IgesBooleanTreeEntity(e));
                    }
                    else if (rightItem is IIgesBooleanTreeItem)
                    {
                        node.RightChild = (IIgesBooleanTreeItem)rightItem;
                    }
                    else
                    {
                        throw new InvalidOperationException("Unexpected item on stack: " + rightItem.GetType().Name);
                    }

                    if (leftItem is int)
                    {
                        binder.BindEntity((int)leftItem, e => node.LeftChild = new IgesBooleanTreeEntity(e));
                    }
                    else if (leftItem is IIgesBooleanTreeItem)
                    {
                        node.LeftChild = (IIgesBooleanTreeItem)leftItem;
                    }
                    else
                    {
                        throw new InvalidOperationException("Unexpected item on stack: " + leftItem.GetType().Name);
                    }

                    stack.Push(node);
                }
            }

            RootNode = stack.Count == 0
                ? null
                : (IIgesBooleanTreeItem)stack.Pop();

            return(index);
        }
Esempio n. 2
0
 private int GetItemCount(IIgesBooleanTreeItem node)
 {
     if (node.IsEntity)
     {
         return(1);
     }
     else
     {
         var operation = (IgesBooleanTreeOperation)node;
         return(GetItemCount(operation.LeftChild)
                + GetItemCount(operation.RightChild)
                + 1);
     }
 }
Esempio n. 3
0
        private IEnumerable <IgesEntity> GetReferencedEntities(IIgesBooleanTreeItem node)
        {
            if (node.IsEntity)
            {
                yield return(((IgesBooleanTreeEntity)node).Entity);
            }
            else
            {
                var operation = (IgesBooleanTreeOperation)node;
                foreach (var entity in GetReferencedEntities(operation.LeftChild))
                {
                    yield return(entity);
                }

                foreach (var entity in GetReferencedEntities(operation.RightChild))
                {
                    yield return(entity);
                }
            }
        }
Esempio n. 4
0
 public IgesBooleanTree(IIgesBooleanTreeItem rootNode)
 {
     EntityUseFlag = IgesEntityUseFlag.Geometry;
     RootNode      = rootNode;
 }
Esempio n. 5
0
 private void WriteParameters(List <object> parameters, IgesWriterBinder binder, IIgesBooleanTreeItem node)
 {
     if (node.IsEntity)
     {
         parameters.Add(-binder.GetEntityId(((IgesBooleanTreeEntity)node).Entity));
     }
     else
     {
         var operation = (IgesBooleanTreeOperation)node;
         WriteParameters(parameters, binder, operation.LeftChild);
         WriteParameters(parameters, binder, operation.RightChild);
         parameters.Add((int)operation.OperationKind);
     }
 }
Esempio n. 6
0
 public IgesBooleanTree(IIgesBooleanTreeItem rootNode, IgesFile file) : base(file)
 {
     EntityUseFlag = IgesEntityUseFlag.Geometry;
     RootNode      = rootNode;
 }
Esempio n. 7
0
 public IgesBooleanTreeOperation(IgesBooleanTreeOperationKind operationKind, IIgesBooleanTreeItem leftChild, IIgesBooleanTreeItem rightChild)
 {
     OperationKind = operationKind;
     LeftChild     = leftChild;
     RightChild    = rightChild;
 }