Another version
using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System.Collections;
namespace TlsCad.Collections
{
/// <summary>
/// TypedValue Tree
/// </summary>
///
public enum ResultType
{
Node,
List,
DottedPair,
RelationalOperator,
LogicalOperator,
}
public class ResultTree : IEnumerable
{
ResultType _type;
TypedValue _value;
List<ResultTree> _lst = new List<ResultTree>();
public ResultTree this[int index]
{
get
{
if (_lst.Count==0)
{
if(index==0)
{
return this;
}
}
else
{
if (index>=0 && index < _lst.Count)
{
return _lst[index];
}
}
return null;
}
}
public TypedValue TypedValue
{
get { return _value; }
}
public List<ResultTree> Nodes
{
get { return _lst; }
}
public ResultType Type
{
get { return _type; }
}
public ResultTree()
{
_type = ResultType.Node;
}
public ResultTree(TypedValue value)
:this()
{
_value = value;
}
public ResultTree(int typeCode, object obj)
: this(new TypedValue(typeCode, obj))
{ }
public ResultTree(LispDataType type, object obj)
: this(new TypedValue((int)type, obj))
{ }
public ResultTree(DxfCode type, object obj)
: this(new TypedValue((int)type, obj))
{ }
public ResultTree(string operatorContext, bool isLogicalOperator)
{
_type = isLogicalOperator ? ResultType.LogicalOperator : ResultType.RelationalOperator;
_value = new TypedValue(-4, operatorContext);
}
public ResultTree(string operatorContext)
: this(operatorContext, true)
{ }
public ResultTree(ResultType type)
{
_type = type;
}
public void Add(TypedValue value)
{
_lst.Add(new ResultTree(value));
}
public void Add(int typeCode, object obj)
{
_lst.Add(new ResultTree(typeCode, obj));
}
public void Add(LispDataType type, object obj)
{
_lst.Add(new ResultTree(type, obj));
}
public void Add(DxfCode type, object obj)
{
_lst.Add(new ResultTree(type, obj));
}
public void Add(ResultTree rt)
{
_lst.Add(rt);
}
public void Add(short value)
{
_lst.Add(new ResultTree(LispDataType.Int16, value));
}
public void Add(int value)
{
_lst.Add(new ResultTree(LispDataType.Int32, value));
}
public void Add(double value)
{
_lst.Add(new ResultTree(LispDataType.Double, value));
}
public void Add(string value)
{
_lst.Add(new ResultTree(LispDataType.Text, value));
}
public void Add(Point2d value)
{
_lst.Add(new ResultTree(LispDataType.Point2d, value));
}
public void Add(Point3d value)
{
_lst.Add(new ResultTree(LispDataType.Point3d, value));
}
public void Add(ObjectId value)
{
_lst.Add(new ResultTree(LispDataType.ObjectId, value));
}
public void Add(SelectionSet value)
{
_lst.Add(new ResultTree(LispDataType.SelectionSet, value));
}
public static implicit operator SelectionFilter(ResultTree rtree)
{
return new SelectionFilter(rtree.ToArray());
}
public static implicit operator ResultBuffer(ResultTree rtree)
{
return new ResultBuffer(rtree.ToArray());
}
public TypedValue[] ToArray()
{
List<TypedValue> values = new List<TypedValue>();
GetValues(values);
return values.ToArray();
}
private void GetValues(List<TypedValue> values)
{
switch (_type)
{
case ResultType.Node:
if (_lst.Count == 0)
{
values.Add(_value);
}
else
{
_lst.ForEach(rtree => rtree.GetValues(values));
}
break;
case ResultType.List:
values.Add(new TypedValue((int)LispDataType.ListBegin));
_lst.ForEach(rtree => rtree.GetValues(values));
values.Add(new TypedValue((int)LispDataType.ListEnd));
break;
case ResultType.DottedPair:
values.Add(new TypedValue((int)LispDataType.ListBegin));
_lst.ForEach(rtree => rtree.GetValues(values));
values.Add(new TypedValue((int)LispDataType.DottedPair));
break;
case ResultType.RelationalOperator:
values.Add(_value);
_lst.ForEach(rtree => rtree.GetValues(values));
break;
case ResultType.LogicalOperator:
values.Add(new TypedValue(-4, "<" + _value.Value));
_lst.ForEach(rtree => rtree.GetValues(values));
values.Add(new TypedValue(-4, _value.Value + ">"));
break;
}
}
#region IEnumerable 成员
IEnumerator IEnumerable.GetEnumerator()
{
return _lst.GetEnumerator();
}
#endregion
}
}
The complete test code
[CommandMethod("t9")]
public static void Test9()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptSelectionResult res1 =
ed.SelectAll(
new ResultTree
{
new ResultTree(">,>,*",false)
{
{10, new Point3d()}
},
new ResultTree("<,<,*",false)
{
{10,new Point3d(10,10,0)}
}
});
PromptSelectionResult res2 =
ed.SelectAll(
new ResultList
{
{-4,">,>,*"},
{10, new Point3d()},
{-4,"<,<,*"},
{10,new Point3d(10,10,0)}
});
PromptSelectionResult res3 =
ed.SelectAll(
new ResultTree("or")
{
new ResultTree("and")
{
{0, "Line"},
{8, "01"}
},
new ResultTree("and")
{
{0, "Circle"},
{8, "02"}
}
});
PromptSelectionResult res4 =
ed.SelectAll(
new ResultList
{
{-4,"<or"},
{-4,"<and"},
{0, "Line"},
{8, "01"},
{-4,"and>"},
{-4,"<and"},
{0, "Circle"},
{8, "02"},
{-4,"and>"},
{-4,"or>"}
});
}
[CommandMethod("t10")]
public static void Test10()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptEntityResult res = ed.GetEntity("Select a Entity:");
using (DBTransaction tr = new DBTransaction())
{
tr.OpenRegAppTable(OpenMode.ForWrite);
tr.RegApp("MyApp");
Entity ent = tr.GetObject(res.ObjectId, OpenMode.ForWrite) as Entity;
ent.XData =
new ResultList
{
{1001, "MyApp"},
{1000, "This is a Test"},
{DxfCode.ExtendedDataInteger16, 12}
};
}
}
[LispFunction("lsptest1")]
public static ResultBuffer LTest1(ResultBuffer rb)
{
ResultTree rtree =
new ResultTree(ResultType.List)
{
1,
new ResultTree(ResultType.DottedPair)
{
10,
new Point3d(10, 10, 0)
}
};
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
return rtree;
}