Having a little fun here
//(Serialize "c:\\test.dat" "hola")
//(Serialize "c:\\test.dat" '(1 1 1))
//(Serialize "c:\\test.dat" '(1 2 3 1.2 "Wow This is almost cool"))
//(UnSerialize "c:\\test.dat")
//(SaveVars "c:\\test.dat")
//(RestoreVars "c:\\test.dat")
//(defun savevars (path / outlist varlist)
// (setq outlist '())
// (setq varlist '("osmode" "cmdecho" "attdia" "pickstyle"))
// (foreach e varlist
// (setq outlist (cons (cons e (getvar e)) outlist))
// )
// (Serialize path outlist)
//)
//(defun RestoreVars (path / e inlist)
// (setq inlist (UnSerialize path))
// (if (/=(car inlist) nill)
// (foreach e inlist
// (setvar (car e)(cdr e) )
// )
// )
// (princ)
//)
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
[assembly: CommandClass(typeof(LispSerialization.Commands))]
namespace LispSerialization
{
public class Commands
{
public Commands()
{
}
[LispFunction("Serialize")]
static public ResultBuffer dome(ResultBuffer Rb)
{
ResultBuffer RetRb = new ResultBuffer();
try
{
TypedValue[] tvArray = Rb.AsArray();
Stream stream = new FileStream((string)tvArray[0].Value, FileMode.Create);
try
{
List<KeyValuePair<int, Object>>
kvList = new List<KeyValuePair<int, object>>();
for (int i = 1; i < tvArray.Length; i++)
{
switch ((int)tvArray[i].TypeCode)
{
case (int)LispDataType.Point2d:
{
Point2d pt = (Point2d)tvArray[i].Value;
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.ListBegin, null));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.Double, pt.X));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.Double, pt.Y));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.ListEnd, null));
}
break;
case (int)LispDataType.Point3d:
{
Point3d pt = (Point3d)tvArray[i].Value;
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.ListBegin, null));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.Double, pt.X));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.Double, pt.Y));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.Double, pt.Z));
kvList.Add(new KeyValuePair<int, object>
((int)LispDataType.ListEnd, null));
}
break;
case (int)LispDataType.Angle:
case (int)LispDataType.DottedPair:
case (int)LispDataType.Double:
case (int)LispDataType.Int16:
case (int)LispDataType.Int32:
case (int)LispDataType.ListBegin:
case (int)LispDataType.ListEnd:
case (int)LispDataType.Nil:
case (int)LispDataType.None:
//case (int)LispDataType.Orientation:
case (int)LispDataType.T_atom:
case (int)LispDataType.Text:
case (int)LispDataType.Void:
kvList.Add(new KeyValuePair<int, object>
((int)tvArray[i].TypeCode, (object)tvArray[i].Value));
break;
}
}
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, kvList);
RetRb.Add(new TypedValue((int)LispDataType.T_atom));
}
finally
{
stream.Close();
}
}
catch
{
RetRb.Add(new TypedValue((int)LispDataType.Nil));
}
return RetRb;
}
[LispFunction("UnSerialize")]
static public ResultBuffer undome(ResultBuffer Rb)
{
TypedValue[] tvArray = Rb.AsArray();
ResultBuffer RetRb = new ResultBuffer();
Stream stream = null;
try
{
stream = new FileStream((string)tvArray[0].Value, FileMode.Open);
IFormatter formatter = new BinaryFormatter();
List<KeyValuePair<int, Object>> kvList =
(List<KeyValuePair<int, Object>>)formatter.Deserialize(stream);
for (int i = 0; i < kvList.Count; i++)
{
RetRb.Add(new TypedValue(kvList[i].Key, kvList[i].Value));
}
}
catch
{
RetRb.Add(new TypedValue((int)LispDataType.Nil));
}
finally
{
stream.Close();
}
return RetRb;
}
}
}