找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2111|回复: 1

[分享] sXrecord.cs

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-4 15:06:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. using System;
  2. using System.Diagnostics;
  3. using System.Collections;
  4. using System.Windows.Forms;
  5. using System.Reflection;
  6. using System.IO;
  7. using System.Runtime.InteropServices;
  8. using Yekai.CsArx.Geometry;
  9. //using Yekai.CsArx.Enum;
  10. using Yekai.CsArx.Function;
  11. using Yekai.CsArx.AcadCom;

  12. using Autodesk.AutoCAD.Runtime;
  13. using Autodesk.AutoCAD.DatabaseServices;
  14. using Autodesk.AutoCAD.Geometry;
  15. using Autodesk.AutoCAD.Colors;
  16. using Autodesk.AutoCAD.EditorInput;
  17. using Autodesk.AutoCAD.ApplicationServices;
  18. using Autodesk.AutoCAD.Windows;
  19. using Autodesk.AutoCAD.GraphicsInterface;
  20. using Autodesk.AutoCAD.Interop.Common;
  21. using app = Autodesk.AutoCAD.ApplicationServices.Application;
  22. using AColor = Autodesk.AutoCAD.Colors.Color;

  23. namespace Yekai.CsArx
  24. {
  25.   /// <summary>
  26.   /// 读写扩展记录Xrecord 扩展数据XData 链表ResultBuffer TypedValue 等数据的类
  27.   /// Version : 2009.06.11
  28.   /// 备注:上传[url]www.pudn.com[/url]
  29.   /// </summary>
  30.   public class sXr
  31.   {
  32.     /// <summary>
  33.     /// 将字符串转换为对应类型值
  34.     /// 以能处理的数据类型bool Boolean int Int32 Radian360 Double double  
  35.     /// String string Point Point3d Vector3d sPosition sPositionCollection
  36.     /// Version : 2009.02.14
  37.     /// 1,数组字符串要使用":"好分隔
  38.     /// </summary>
  39.     /// <param name="valueString">字符串</param>
  40.     /// <param name="valueType">将要转换的数据类型</param>
  41.     /// <returns>成功返回对应值,否则返回null</returns>
  42.     public static object GetValue(string valueString, System.Type valueType)
  43.     {
  44.       try
  45.       {
  46.         if (valueType.Equals(typeof(System.Type)))
  47.         { return System.Type.GetType(valueString, true, true); }
  48.         else if (valueType.IsEnum)
  49.         {
  50.           //smc.ed.WriteMessage(" 41 ");
  51.           return System.Enum.Parse(valueType, valueString, true);
  52.         }
  53.         else if (valueType.IsArray)
  54.         {
  55.           //smc.ed.WriteMessage(" 42 ");
  56.           char[] chars2 = { ':' };
  57.           return fun.ArrayFromString(valueString, valueType.GetElementType(), chars2);
  58.         }
  59.         else
  60.         {
  61.           switch (valueType.Name)
  62.           {
  63.             case "bool":
  64.             case "Boolean":
  65.               //smc.ed.WriteMessage(" 43 ");
  66.               return System.Convert.ToBoolean(valueString);
  67.             case "int":
  68.             case "Int32":
  69.               //smc.ed.WriteMessage(" 44 ");
  70.               return System.Convert.ToInt32(valueString);
  71.             case "Radian360":
  72.               //smc.ed.WriteMessage(" 45 ");
  73.               return (Radian360)valueString;
  74.             case "sPosition":
  75.               //smc.ed.WriteMessage(" 45 ");
  76.               return (sPosition)valueString;
  77.             case "Double":
  78.             case "double":
  79.               //smc.ed.WriteMessage(" 45 ");
  80.               return System.Convert.ToDouble(valueString);
  81.             case "String":
  82.             case "string":
  83.               //smc.ed.WriteMessage(" 46 ");                                    
  84.               return valueString;
  85.             case "Point":
  86.             case "Point3d":
  87.               Point3d p1;
  88.               if (fun.GetPoint3d(valueString, out p1))
  89.               {
  90.                 //smc.ed.WriteMessage(" 47 ");
  91.                 return p1;
  92.               }
  93.               break;
  94.             case "Vector3d":
  95.               Point3d p2;
  96.               if (fun.GetPoint3d(valueString, out p2))
  97.               {
  98.                 return p2.GetAsVector();
  99.               }
  100.               break;
  101.             case "ObjectId":
  102.               try
  103.               {
  104.                 return smc.db.GetObjectId(false, new Handle(Convert.ToInt64(valueString, 16)), 0);
  105.               }
  106.               catch { return ObjectId.Null; }
  107.             case "Point3dCollection":
  108.             case "Vector3dCollection":
  109.             case "ObjectIdCollection":
  110.             case "sPositionCollection":
  111.               return fun.CollectionFromString(valueString, valueType, ":".ToCharArray());
  112.             case "Hanhle":
  113.               return new Handle(Convert.ToInt64(valueString, 16));
  114.           }
  115.         }
  116.         return null;
  117.       }
  118.       catch (System.Exception ex)
  119.       {
  120.         smc.WriteLine(ex);
  121.         return null;
  122.       }
  123.     }
  124.     /// <summary>
  125.     /// 获取链表里某个关键字对应的值
  126.     /// Note:
  127.     /// 1,没有分割符号,即前名后值时separator应为""空字符串,
  128.     /// 此时valueType被忽略,返回值类型就是链表里该值的类型
  129.     /// 2,有分隔符号而valueType==null时返回值部分的字符串(即分隔符号右边字符串)
  130.     /// </summary>
  131.     /// <param name="resBuf">链表</param>
  132.     /// <param name="keyName">关键字</param>
  133.     /// <param name="valueType">返回值类型</param>
  134.     /// <param name="separator">分割符号</param>
  135.     /// <returns>成功找到关键字并成功转换成返回值类型则返回该值,否则返回null</returns>
  136.     public static object GetKeyValue(ResultBuffer resBuf, string keyName, System.Type valueType, string separator)
  137.     {
  138.       try
  139.       {
  140.         //smc.ed.WriteMessage("\nGetPartFromResultBuffer step 1");
  141.         if (resBuf == null) return null;
  142.         TypedValue[] tValues = resBuf.AsArray();
  143.         string propertyName;
  144.         string propertyValue;
  145.         if (separator == "")
  146.         {
  147.           int startIndex = 0;
  148.           if (tValues[0].TypeCode == 1001)
  149.             startIndex = 1;
  150.           for (int i = startIndex; i < tValues.Length - 1; i += 2)
  151.           {
  152.             if (string.Equals(tValues[i].Value.ToString(), keyName, StringComparison.OrdinalIgnoreCase))
  153.             {
  154.               return tValues[i + 1].Value;
  155.             }
  156.           }
  157.         }
  158.         else
  159.         {
  160.           for (int i = 0; i < tValues.Length; i++)
  161.           {
  162.             char[] arrChar = separator.ToCharArray();
  163.             string[] nameValue = tValues[i].Value.ToString().Split(arrChar);
  164.             if (nameValue.Length == 2)
  165.             {
  166.               propertyName = nameValue[0];
  167.               propertyValue = nameValue[1];
  168.               if (string.Equals(propertyName, keyName, StringComparison.OrdinalIgnoreCase))
  169.               {
  170.                 if (valueType == null)
  171.                   return propertyValue;
  172.                 else
  173.                   return sXr.GetValue(propertyValue, valueType);
  174.               }
  175.             }
  176.           }
  177.         }
  178.         return null;
  179.       }
  180.       catch (System.Exception ex)
  181.       {
  182.         smc.WriteLine(ex);
  183.         return null;
  184.       }
  185.     }
  186.     /// <summary>
  187.     /// 设置链表里某个关键字对应的值,若输入键不存在则在表里添加
  188.     /// Version : 2008.11.10
  189.     /// </summary>
  190.     /// <param name="resBuf">链表,可以为空null</param>
  191.     /// <param name="keyName">键名</param>
  192.     /// <param name="keyValue">键值</param>
  193.     /// <param name="separator">键名与键值的分隔符号,没有则为""</param>
  194.     /// <param name="forXData">是否为用于扩展数据的链表</param>
  195.     /// <returns>成功返回设置后的链表,否则返回null</returns>
  196.     public static ResultBuffer SetKeyValue(ResultBuffer resBuf, string keyName, object keyValue, string separator,bool forXData)
  197.     {
  198.       try
  199.       {
  200.         if (resBuf == null)
  201.         {
  202.           resBuf = new ResultBuffer();
  203.           if (separator == "")
  204.           {
  205.             resBuf.Add(fun.GetTypedValue(keyName, forXData));
  206.             resBuf.Add(fun.GetTypedValue(keyValue, forXData));
  207.           }
  208.           else
  209.           {
  210.             resBuf.Add(fun.GetTypedValue(keyName + separator + keyValue.ToString(), forXData));
  211.           }
  212.           return resBuf;
  213.         }
  214.         TypedValue[] tValues = resBuf.AsArray();
  215.         if (separator == "")
  216.         {
  217.           //当TypedValue[]来自扩展数据时第一个是扩展数据名
  218.           for (int i = forXData ? 1 : 0; i < tValues.Length - 1; i += 2)
  219.           {
  220.             if (tValues[i].Value.ToString().ToUpper() == keyName.ToUpper())
  221.             {
  222.               tValues[i + 1] = fun.GetTypedValue(keyValue, forXData);  
  223.               resBuf = new ResultBuffer(tValues);
  224.               return resBuf;
  225.             }
  226.           }
  227.         }
  228.         else
  229.         {
  230.           for (int i = 0; i < tValues.Length; i++)
  231.           {
  232.             char[] arrChar = separator.ToCharArray();
  233.             string[] nameValue = tValues[i].Value.ToString().Split(arrChar);
  234.             if (nameValue.Length == 2)
  235.             {
  236.               if (string.Equals(nameValue[0], keyName, StringComparison.OrdinalIgnoreCase))
  237.               {
  238.                 tValues[i] = fun.GetTypedValue(keyName + separator + keyValue.ToString(), forXData);
  239.                 resBuf = new ResultBuffer(tValues);
  240.                 return resBuf;
  241.               }
  242.             }
  243.           }
  244.         }
  245.         if (separator == "")
  246.         {
  247.           resBuf.Add(fun.GetTypedValue(keyName, forXData));
  248.           resBuf.Add(fun.GetTypedValue(keyValue, forXData));
  249.         }
  250.         else
  251.         {
  252.           resBuf.Add(fun.GetTypedValue(keyName + separator + keyValue.ToString(), forXData));
  253.         }
  254.         return resBuf;
  255.       }
  256.       catch (System.Exception ex)
  257.       {
  258.         smc.WriteLine(ex);
  259.         return null;
  260.       }
  261.     }
  262.     #region Xrecord read and write

  263.     /// <summary>
  264.     /// 从专用的属性链表生成一个对象实例
  265.     /// 专用的属性链表格式
  266.     /// 以字符串|ObjectType|标识开始,后面紧跟着对象类型名全名
  267.     /// 以字符串PropertyStart标识可写属性开始,PropertyEnd标识可写属性结束
  268.     /// TypedValue数据格式 Name=Value,以=分割属性名和属性值 如: Name=Sieben
  269.     /// PropertyStart和PropertyEnd可以嵌套
  270.     /// Version : 2008.02.27 改用sXr.GetValue()
  271.     /// 特殊处理数据类型 : bool Boolean int Int32 Radian360 Double double  
  272.     /// String string Point3d Pointt Vector3d
  273.     /// </summary>
  274.     /// <param name="resBuf">专用的属性链表</param>
  275.     /// <returns>成功返回一个对象实例,否则返回null</returns>
  276.     public static object GetObjectFromResultBuffer(Assembly tAss, ResultBuffer resBuf)
  277.     {
  278.       try
  279.       {
  280.         //smc.ed.WriteMessage("\nGetPartFromResultBuffer step 1");
  281.         if (resBuf == null) return null;
  282.         TypedValue[] tValues = resBuf.AsArray();
  283.         string typeStr = "";
  284.         int startPlace = 0;
  285.         for (int i = 0; i < tValues.Length; i++)
  286.         {
  287.           if (string.Equals(tValues[i].Value.ToString(), "|ObjectType|", StringComparison.OrdinalIgnoreCase))
  288.           {
  289.             typeStr = tValues[i + 1].Value.ToString();
  290.             startPlace = i + 1;
  291.             break;
  292.           }
  293.         }
  294.         //smc.ed.WriteMessage("\nGetPartFromResultBuffer step 2");
  295.         if (typeStr == "") return null;
  296.         //System.Type partType = System.Type.GetType(typeStr, true);
  297.         System.Type partType = tAss.GetType(typeStr);
  298.         if (partType == null) return null;
  299.         //smc.ed.WriteMessage("\nGetPartFromResultBuffer step 3");
  300.         return sXr.GetObjectFromResultBuffer(partType, tValues, ref startPlace);
  301.       }
  302.       catch (System.Exception ex)
  303.       {
  304.         smc.WriteLine(ex);
  305.         return null;
  306.       }
  307.     }
  308.     /// <summary>
  309.     /// 从专用的属性链表生成一个对象实例
  310.     /// 专用的属性链表格式
  311.     /// 以字符串|ObjectType|标识开始,后面紧跟着对象类型名全名
  312.     /// 以字符串PropertyStart标识可写属性开始,PropertyEnd标识可写属性结束
  313.     /// TypedValue数据格式 Name=Value,以=分割属性名和属性值 如: Name=Sieben
  314.     /// PropertyStart和PropertyEnd可以嵌套
  315.     /// Version : 2009.02.14
  316.     /// </summary>
  317.     /// <param name="objType">对象实例类型</param>
  318.     /// <param name="tValues">专用的属性链表</param>
  319.     /// <param name="proIndex">属性链表的开始位置</param>
  320.     /// <returns>成功返回一个对象实例,否则返回null</returns>
  321.     public static object GetObjectFromResultBuffer(System.Type objType, TypedValue[] tValues, ref int proIndex)
  322.     {
  323.       try
  324.       {
  325.         //smc.ed.WriteMessage("\nGetObjectFromResultBuffer 1 Index = " + proIndex.ToString());
  326.         System.Type[] partParams = { };
  327.         ConstructorInfo objConstructor = objType.GetConstructor(partParams);
  328.         if (objConstructor == null) return null;
  329.         object[] constructorParams = { };
  330.         object curObj = objConstructor.Invoke(constructorParams);
  331.         if (curObj == null) return null;
  332.         bool propertyStart = false;
  333.         bool propertyEnd = false;
  334.         string propertyName = "";
  335.         string propertyValue = "";
  336.         char[] chars = { '=' };
  337.         object[] pars = { };
  338.         //smc.ed.WriteMessage("\nGetObjectFromResultBuffer 2 curObj = " + curObj.GetType().Name);
  339.         for (; proIndex < tValues.Length; proIndex++)
  340.         {
  341.           //smc.ed.WriteMessage("\nIndex = " + proIndex.ToString() + " " + tValues[proIndex].Value.ToString() + "::");
  342.           //smc.ed.WriteMessage(curObj.GetType().Name);
  343.           if (string.Equals(tValues[proIndex].Value.ToString(), "PropertyStart", StringComparison.OrdinalIgnoreCase))
  344.           {
  345.             //smc.ed.WriteMessage(" 11 ");
  346.             propertyStart = true;
  347.           }
  348.           else if (string.Equals(tValues[proIndex].Value.ToString(), "PropertyEnd", StringComparison.OrdinalIgnoreCase))
  349.           {
  350.             //smc.ed.WriteMessage(" 12 ");
  351.             propertyEnd = true;
  352.             if (propertyStart && propertyEnd)
  353.             {
  354.               //smc.ed.WriteMessage(" 13 ");
  355.               return curObj;
  356.             }
  357.           }
  358.           else
  359.           {
  360.             //smc.ed.WriteMessage(" 14 ");
  361.             if (propertyStart && !propertyEnd)
  362.             {
  363.               //smc.ed.WriteMessage(" 2 ");
  364.               string[] nameValue = tValues[proIndex].Value.ToString().Split(chars);
  365.               if (nameValue.Length == 2)
  366.               {
  367.                 propertyName = nameValue[0];
  368.                 propertyValue = nameValue[1];
  369.                 System.Reflection.PropertyInfo pInfo = objType.GetProperty(propertyName);
  370.                 //smc.ed.WriteMessage(" 31 ");
  371.                 if (pInfo != null)
  372.                 {
  373.                   //smc.ed.WriteMessage(" 32 ");
  374.                   if (pInfo.PropertyType.IsEnum)
  375.                   {
  376.                     //smc.ed.WriteMessage(" 41 ");
  377.                     pInfo.SetValue(curObj, System.Enum.Parse(pInfo.PropertyType, propertyValue, true), pars);
  378.                   }
  379.                   else if (pInfo.PropertyType.IsArray)
  380.                   {
  381.                     //smc.ed.WriteMessage(" 42 ");
  382.                     char[] chars2 = { ':' };
  383.                     pInfo.SetValue(curObj, fun.ArrayFromString(propertyValue, pInfo.PropertyType.GetElementType(), chars2), pars);
  384.                   }
  385.                   else
  386.                   {
  387.                     //smc.ed.WriteMessage("\nsXr.GetObjectFromResultBuffer pInfo.PropertyType = {0}",pInfo.PropertyType.Name);
  388.                     switch (pInfo.PropertyType.Name)
  389.                     {
  390.                       case "bool":
  391.                       case "Boolean":
  392.                         //smc.ed.WriteMessage(" 43 ");
  393.                         pInfo.SetValue(curObj, System.Convert.ToBoolean(propertyValue), pars);
  394.                         break;
  395.                       case "int":
  396.                       case "Int32":
  397.                         //smc.ed.WriteMessage(" 44 ");
  398.                         pInfo.SetValue(curObj, System.Convert.ToInt32(propertyValue), pars);
  399.                         break;
  400.                       case "Radian360":
  401.                         //smc.ed.WriteMessage(" 45 ");
  402.                         pInfo.SetValue(curObj, (Radian360)propertyValue, pars);
  403.                         break;
  404.                       case "sPosition":
  405.                         //smc.ed.WriteMessage(" 45 ");
  406.                         pInfo.SetValue(curObj, (sPosition)propertyValue, pars);
  407.                         break;
  408.                       case "Double":
  409.                       case "double":
  410.                         //smc.ed.WriteMessage(" 45 ");
  411.                         pInfo.SetValue(curObj, System.Convert.ToDouble(propertyValue), pars);
  412.                         break;
  413.                       case "String":
  414.                       case "string":
  415.                         //smc.ed.WriteMessage(" 46 ");                                    
  416.                         pInfo.SetValue(curObj, propertyValue, pars);
  417.                         break;
  418.                       case "Point":
  419.                       case "Point3d":
  420.                         smc.ed.WriteMessage(" 471 ");
  421.                         Point3d p1;
  422.                         if (fun.GetPoint3d(propertyValue, out p1))
  423.                         {
  424.                           smc.ed.WriteMessage(" 472 ");
  425.                           pInfo.SetValue(curObj, p1, pars);
  426.                         }
  427.                         smc.ed.WriteMessage(" 473 ");
  428.                         break;
  429.                       case "Vector3d":
  430.                         Point3d p2;
  431.                         if (fun.GetPoint3d(propertyValue, out p2))
  432.                         {
  433.                           pInfo.SetValue(curObj, p2.GetAsVector(), pars);
  434.                         }
  435.                         break;
  436.                       case "Point3dCollection":
  437.                       case "Vector3dCollection":
  438.                       case "ObjectIdCollection":
  439.                       case "sPositionCollection":
  440.                         {
  441.                           Object tObj = fun.CollectionFromString(propertyValue, pInfo.PropertyType, ":".ToCharArray());
  442.                           pInfo.SetValue(curObj, tObj, pars);
  443.                         }
  444.                         break;
  445.                       default:
  446.                         //smc.ed.WriteMessage(" 48 ");
  447.                         if (pInfo.PropertyType.IsClass)
  448.                         {
  449.                           //smc.ed.WriteMessage(" 51 ");
  450.                           if (propertyValue != "")
  451.                           {
  452.                             //smc.ed.WriteMessage(" 52 ");
  453.                             object tempObj = null;
  454.                             System.Type valueType = System.Type.GetType(propertyValue);
  455.                             if (valueType != null)
  456.                               tempObj = sXr.GetObjectFromResultBuffer(valueType, tValues, ref proIndex);
  457.                             else
  458.                               tempObj = sXr.GetObjectFromResultBuffer(pInfo.PropertyType, tValues, ref proIndex);
  459.                             pInfo.SetValue(curObj, tempObj, pars);

  460.                           }
  461.                         }
  462.                         else
  463.                         {
  464.                           pInfo.SetValue(curObj, sXr.GetValue(propertyValue, pInfo.PropertyType), pars);
  465.                         }
  466.                         break;
  467.                     }
  468.                   }
  469.                 }
  470.               }
  471.             }
  472.           }
  473.         }
  474.         return curObj;
  475.       }
  476.       catch (System.Exception ex)
  477.       {
  478.         smc.WriteLine(ex);
  479.         return null;
  480.       }
  481.     }
  482.     private static int GetResultBufferFromObject_time = 0;
  483.     /// <summary>
  484.     /// 根据一个对象实例的可写属性生成一个专用的属性链表,
  485.     /// 专用的属性链表格式
  486.     /// 以字符串|ObjectType|标识开始,后面紧跟着对象类型名全名
  487.     /// 以字符串PropertyStart标识可写属性开始,PropertyEnd标识可写属性结束
  488.     /// TypedValue数据格式 Name=Value,以=分割属性名和属性值 如: Name=Sieben
  489.     /// PropertyStart和PropertyEnd可以嵌套
  490.     /// Version : 2007.10.11
  491.     /// 1,增加对死循环的监控 2008.02.18
  492.     /// 2,当引用类型属性无法获得非null实例时使用0代替
  493.     /// </summary>
  494.     /// <param name="obj">对象实例</param>
  495.     /// <param name="resBuf">专用的属性链表,可以为null,若非null则新链表追加到里面</param>
  496.     /// <param name="forXData">是否用于扩展数据</param>
  497.     /// <returns>成功返回专用的属性链表,否则返回null</returns>
  498.     public static ResultBuffer GetResultBufferFromObject(object obj, ResultBuffer resBuf,bool forXData)
  499.     {
  500.       try
  501.       {
  502.         //smc.ed.WriteMessage("\n sXr.GetResultBufferFromObject 1");
  503.         if (obj == null) return null;
  504.         //smc.ed.WriteMessage("\nsXr.GetResultBufferFromObject {0}", obj.GetType());
  505.         if (GetResultBufferFromObject_time > 200)
  506.         {
  507.           //smc.ed.WriteMessage("\nsXr.GetResultBufferFromObject 可能陷入死循环 {0}", obj.GetType());
  508.           return null;
  509.         }
  510.         else
  511.         {
  512.           GetResultBufferFromObject_time++;
  513.         }
  514.         object[] pars = { };
  515.         PropertyInfo[] pInfos = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
  516.         if (pInfos.Length == 0) return resBuf;
  517.         if (resBuf == null)
  518.         {
  519.           GetResultBufferFromObject_time = 0;
  520.           resBuf = new ResultBuffer();
  521.           resBuf.Add(fun.GetTypedValue("|ObjectType|", forXData));
  522.           resBuf.Add(fun.GetTypedValue(obj.GetType().FullName, forXData));
  523.         }
  524.         resBuf.Add(fun.GetTypedValue("PropertyStart", forXData));//引用数据开始
  525.         for (int i = 0; i < pInfos.Length; i++)
  526.         {
  527.           if (pInfos[i].CanWrite)
  528.           {
  529.             //smc.ed.WriteMessage("\n PropertyType = {0}", pInfos[i].PropertyType.Name);
  530.             if (pInfos[i].PropertyType.IsValueType)//属性为值类型
  531.             {
  532.               //smc.ed.WriteMessage(" 21 ");
  533.               object objValue = null;
  534.               try
  535.               {
  536.                 objValue = pInfos[i].GetValue(obj, pars);
  537.               }
  538.               catch (System.Exception ex1)
  539.               {
  540.                  
  541.                 smc.WriteLine(ex1);
  542.               }
  543.               finally
  544.               {
  545.                 if (objValue == null)
  546.                   objValue = "";
  547.               }              
  548.               resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + objValue.ToString(), forXData));
  549.             }
  550.             else if (pInfos[i].PropertyType.IsClass)//属性为引用类型
  551.             {
  552.               //smc.ed.WriteMessage(" 22 ");
  553.               object objValue = pInfos[i].GetValue(obj, pars);
  554.               if (objValue == null)
  555.                 resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=", forXData));//对象为空是用空字符串表示
  556.               else if (pInfos[i].PropertyType.Equals(typeof(string)))//string类
  557.                 resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + objValue.ToString(), forXData));
  558.               else if (pInfos[i].PropertyType.IsArray)//属性为数组
  559.               {
  560.                 //smc.ed.WriteMessage(" 23 ");
  561.                 resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + fun.ArrayToString(objValue, ':'), forXData));
  562.               }
  563.               else if (pInfos[i].PropertyType.Equals(typeof(ObjectIdCollection))
  564.              || pInfos[i].PropertyType.Equals(typeof(Point3dCollection))  
  565.                 || pInfos[i].PropertyType.Equals(typeof(Vector3dCollection))
  566.                 || pInfos[i].PropertyType.Equals(typeof(sPositionCollection)))
  567.               {
  568.                 //smc.ed.WriteMessage(" 24 ");
  569.                 string strClt = fun.CollectionToString(objValue, ':');
  570.                 resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + strClt, forXData));
  571.               }
  572.               else
  573.               {
  574.                 //smc.ed.WriteMessage(" 25 ");
  575.                 resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + objValue.GetType().FullName, forXData));
  576.                 if (GetResultBufferFromObject_time > 40)
  577.                 {
  578.                   //smc.ed.WriteMessage("\nsXr.GetResultBufferFromObject 可能陷入死循环 {0}",objValue.GetType().FullName );
  579.                   return null;
  580.                 }
  581.                 sXr.GetResultBufferFromObject(objValue, resBuf, forXData);//记录属性对象的属性
  582.               }
  583.             }
  584.             else//属性为其他类型,应该没有了
  585.             {
  586.               //smc.ed.WriteMessage(" 25 ");
  587.               resBuf.Add(fun.GetTypedValue(pInfos[i].Name + "=" + pInfos[i].PropertyType.Name, forXData));
  588.             }
  589.           }
  590.           GetResultBufferFromObject_time = 0;
  591.         }
  592.         resBuf.Add(fun.GetTypedValue("PropertyEnd", forXData));//引用数据结束
  593.         //smc.ed.WriteMessage("\nGetPartResultBuffer 1 step 2");
  594.         return resBuf;
  595.       }
  596.       catch (System.Exception ex)
  597.       {
  598.         smc.WriteLine(ex);
  599.         return null;
  600.       }
  601.     }
  602.     /// <summary>
  603.     /// 获取数据词典某个记录的值
  604.     /// Version : 2007.10.30 旧的专用函数,可以考虑取消
  605.     /// </summary>
  606.     /// <param name="rootDictionary">根数据词典</param>
  607.     /// <param name="dictionary">数字词典</param>
  608.     /// <param name="name">记录名</param>
  609.     /// <returns></returns>      
  610.     public static sRecords GetSRecords(string rootDictionary, string dictionary, string name)
  611.     {
  612.       sRecords recs;
  613.       Database cdb = HostApplicationServices.WorkingDatabase;
  614.       using (Transaction ctrans = cdb.TransactionManager.StartTransaction())
  615.       {
  616.         try
  617.         {
  618.           DBDictionary NOD = (DBDictionary)ctrans.GetObject(cdb.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  619.           DBDictionary sDict = (DBDictionary)ctrans.GetObject(NOD.GetAt(rootDictionary), OpenMode.ForRead);
  620.           DBDictionary divDict = (DBDictionary)ctrans.GetObject(sDict.GetAt(dictionary), OpenMode.ForRead);
  621.           Xrecord xrec = (Xrecord)ctrans.GetObject(divDict.GetAt(name), OpenMode.ForRead);
  622.           recs = sRecords.FromTypedVales(xrec.Data.AsArray());
  623.           ctrans.Commit();
  624.         }
  625.         catch (System.Exception ex)
  626.         {
  627.           smc.WriteLine(ex);
  628.           recs = null;
  629.         }
  630.       }
  631.       return recs;
  632.     }
  633.     /// <summary>
  634.     /// Version : 2007.10.30 旧的专用函数,可以考虑取消
  635.     /// </summary>
  636.     /// <param name="rootDictionary"></param>
  637.     /// <param name="dictionary"></param>
  638.     /// <param name="groupName"></param>
  639.     /// <param name="recordName"></param>
  640.     /// <returns></returns>
  641.     public static object GetSRecords(string rootDictionary, string dictionary, string groupName, string recordName)
  642.     {
  643.       sRecords recs = sXr.GetSRecords(rootDictionary, dictionary, groupName);
  644.       return recs[recordName];
  645.     }
  646.     /// <summary>
  647.     /// 获取数据词典
  648.     /// Version : 2007.10.30
  649.     /// </summary>
  650.     /// <param name="dictNames">数据词典全名数组</param>
  651.     /// <param name="create">数据词典不存在时是否创建</param>
  652.     /// <returns>成功返回数据词典ObjectId,否则返回ObjectId.Null</returns>
  653.     public static ObjectId GetDictionary(string[] dictNames, bool create)
  654.     {
  655.       try
  656.       {
  657.         //smc.ed.WriteMessage("\nadb.GetDictionary : " );
  658.         ObjectId reId = ObjectId.Null;
  659.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  660.         {
  661.           ObjectId dictId;
  662.           DBDictionary curDict = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  663.           for (int i = 0; i < dictNames.Length; i++)
  664.           {
  665.             if (curDict.Contains(dictNames[i]))
  666.             {
  667.               dictId = curDict.GetAt(dictNames[i]);
  668.               curDict = (DBDictionary)ctrans.GetObject(dictId, OpenMode.ForRead);
  669.             }
  670.             else
  671.             {
  672.               if (create)
  673.               {
  674.                 curDict.UpgradeOpen();
  675.                 DBDictionary tDict = new DBDictionary();
  676.                 curDict.SetAt(dictNames[i], tDict);
  677.                 ctrans.AddNewlyCreatedDBObject(tDict, true);
  678.                 curDict = tDict;
  679.               }
  680.               else
  681.               {
  682.                 ctrans.Dispose();
  683.                 return ObjectId.Null;
  684.               }
  685.             }
  686.           }
  687.           reId = curDict.ObjectId;
  688.           ctrans.Commit();
  689.         }
  690.         return reId;
  691.       }
  692.       catch (System.Exception ex)
  693.       {
  694.         smc.WriteLine(ex);
  695.         return ObjectId.Null;
  696.       }
  697.     }
  698.     /// <summary>
  699.     /// 获取或创建一个数据词典
  700.     /// Version : 2007.10.30
  701.     /// </summary>
  702.     /// <param name="dictNames">数据词典路径全名</param>
  703.     /// <param name="create">当数据词典不存在时是否创建</param>
  704.     /// <returns>成功返回数据词典的ObjectId,否则返回ObjectId.Null</returns>
  705.     public static ObjectId GetDictionary(string dictNames, bool create)
  706.     {
  707.       try
  708.       {
  709.         //smc.ed.WriteMessage("\nadb.GetDictionary : " + dictNames);
  710.         char[] chars = { '.' };
  711.         string[] nameArr = dictNames.Split(chars);
  712.         return GetDictionary(nameArr, create);
  713.       }
  714.       catch (System.Exception ex)
  715.       {
  716.         smc.WriteLine(ex);
  717.         return ObjectId.Null;
  718.       }
  719.     }
  720.     public static DBDictionary GetDictionary(Transaction ctrans, string[] dictNames, bool create)
  721.     {
  722.       try
  723.       {
  724.         if (ctrans == null || dictNames == null) return null;
  725.         DBDictionary curDict = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  726.         for (int i = 0; i < dictNames.Length; i++)
  727.         {
  728.           if (curDict.Contains(dictNames[i]))
  729.           {
  730.             curDict = (DBDictionary)ctrans.GetObject(curDict.GetAt(dictNames[i]), OpenMode.ForRead);
  731.           }
  732.           else
  733.           {
  734.             if (create)
  735.             {
  736.               curDict.UpgradeOpen();
  737.               DBDictionary tDict = new DBDictionary();
  738.               curDict.SetAt(dictNames[i], tDict);
  739.               ctrans.AddNewlyCreatedDBObject(tDict, true);
  740.               curDict = tDict;
  741.             }
  742.             else
  743.             {
  744.               return null;
  745.             }
  746.           }
  747.         }
  748.         return curDict;
  749.       }
  750.       catch (System.Exception ex)
  751.       {
  752.         smc.WriteLine(ex);
  753.         return null;
  754.       }
  755.     }
  756.     /// <summary>
  757.     /// 获取或创建一个数据词典
  758.     /// Version : 2007.10.30
  759.     /// </summary>
  760.     /// <param name="dictNames">数据词典路径全名</param>
  761.     /// <param name="create">当数据词典不存在时是否创建</param>
  762.     /// <returns>成功返回数据词典的ObjectId,否则返回ObjectId.Null</returns>
  763.     public static DBDictionary GetDictionary(Transaction ctrans, string dictNames, bool create)
  764.     {
  765.       char[] chars = { '.' };
  766.       string[] nameArr = dictNames.Split(chars);
  767.       return GetDictionary(ctrans, nameArr, create);
  768.     }
  769.     /// <summary>
  770.     /// 获取扩展记录
  771.     /// </summary>
  772.     /// <param name="dictNames">扩展记录所在数据词典全名数组</param>
  773.     /// <param name="xrecordName">扩展记录名</param>
  774.     /// <returns>成功返回扩展记录的ObjectId,否则返回ObjectId.Null</returns>
  775.     public static ObjectId GetXrecord(string[] dictNames, string xrecordName)
  776.     {
  777.       try
  778.       {
  779.         ObjectId reId = ObjectId.Null;
  780.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction()) //Start the transaction.
  781.         {
  782.           ObjectId dictId;
  783.           DBDictionary curDict = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  784.           for (int i = 0; i < dictNames.Length; i++)
  785.           {
  786.             if (curDict.Contains(dictNames[i]))
  787.             {
  788.               dictId = curDict.GetAt(dictNames[i]);
  789.               curDict = (DBDictionary)ctrans.GetObject(dictId, OpenMode.ForRead);
  790.             }
  791.             else
  792.             {
  793.               ctrans.Dispose();
  794.               return ObjectId.Null;
  795.             }
  796.           }
  797.           if (curDict.Contains(xrecordName))
  798.           {
  799.             Xrecord xRec = (Xrecord)ctrans.GetObject(curDict.GetAt(xrecordName), OpenMode.ForRead);
  800.             reId = xRec.ObjectId;
  801.           }
  802.           ctrans.Commit();
  803.         }
  804.         return reId;
  805.       }
  806.       catch (System.Exception ex)
  807.       {
  808.         smc.WriteLine(ex);
  809.         return ObjectId.Null;
  810.       }
  811.     }
  812.     /// <summary>
  813.     /// 获取扩展记录
  814.     /// </summary>
  815.     /// <param name="dictNames">扩展记录所在数据词典全名</param>
  816.     /// <param name="xrecordName">扩展记录名</param>
  817.     /// <returns>成功返回扩展记录的ObjectId,否则返回ObjectId.Null</returns>
  818.     public static ObjectId GetXrecord(string dictNames, string xrecordName)
  819.     {
  820.       try
  821.       {
  822.         char[] chars = { '.' };
  823.         string[] nameArr = dictNames.Split(chars);
  824.         return GetXrecord(nameArr, xrecordName);
  825.       }
  826.       catch (System.Exception ex)
  827.       {
  828.         smc.WriteLine(ex);
  829.         return ObjectId.Null;
  830.       }
  831.     }
  832.     /// <summary>
  833.     /// 设置数据词典记录,若数据词典和词典记录还没有存在就创建
  834.     /// Version : 2007.10.30
  835.     /// Note :
  836.     /// 1,resBuf = ModuleDict.PartDict
  837.     /// 2,resBuf = ModuleDict
  838.     /// </summary>
  839.     /// <param name="dictNames">数据词典全名</param>
  840.     /// <param name="xrecordName">词典记录名</param>
  841.     /// <param name="resBuf">将要写入词典记录的链表</param>
  842.     /// <param name="replace">false当已有记录时在后面追加链表内容,true替换原有内容</param>
  843.     /// <returns></returns>
  844.     public static bool SetXrecord(string dictNames, string xrecordName, ResultBuffer resBuf, bool replace)
  845.     {
  846.       try
  847.       {
  848.         //smc.ed.WriteMessage("\nadb.SetXrecord :" + dictNames+xrecordName);
  849.         if (resBuf == null) return false;
  850.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  851.         {
  852.           ObjectId dictId = sXr.GetDictionary(dictNames, true);
  853.           if (dictId == ObjectId.Null)
  854.           {
  855.             ctrans.Dispose(); return false;
  856.           }
  857.           DBDictionary pDict = (DBDictionary)ctrans.GetObject(dictId, OpenMode.ForRead);
  858.           if (pDict.Contains(xrecordName))
  859.           {
  860.             DBObject pXrec = (DBObject)ctrans.GetObject(pDict.GetAt(xrecordName), OpenMode.ForWrite);
  861.             if (pXrec.GetType() == typeof(Xrecord))
  862.             {
  863.               if (replace)
  864.               {
  865.                 ((Xrecord)pXrec).Data = resBuf;
  866.               }
  867.               else
  868.               {
  869.                 ResultBuffer oldResBuf = ((Xrecord)pXrec).Data;
  870.                 foreach (TypedValue typeValue in resBuf)
  871.                 {
  872.                   oldResBuf.Add(typeValue);
  873.                 }
  874.                 ((Xrecord)pXrec).Data = oldResBuf;

  875.               }
  876.               ctrans.Commit();
  877.               return true;
  878.             }
  879.             else
  880.             {
  881.               ctrans.Commit();
  882.               return false;
  883.             }
  884.           }
  885.           else
  886.           {
  887.             pDict.UpgradeOpen();
  888.             Xrecord pXrec = new Xrecord();
  889.             pXrec.Data = resBuf;
  890.             pDict.SetAt(xrecordName, pXrec);
  891.             ctrans.AddNewlyCreatedDBObject(pXrec, true);
  892.             ctrans.Commit();
  893.             return true;
  894.           }
  895.         }
  896.       }
  897.       catch (System.Exception ex)
  898.       {
  899.         smc.ed.WriteMessage("\nadb.SetXrecord dictNames={0},xrecordName={1}:", dictNames, xrecordName);
  900.         smc.WriteLine(ex);
  901.         return false;
  902.       }
  903.     }

  904.     /// <summary>
  905.     /// 设置系统变量
  906.     /// 系统变量在扩展记录的数据结构KeyName=KeyValue
  907.     /// Version : 2008.11.05
  908.     /// </summary>
  909.     /// <param name="dictNames">数据词典路径</param>
  910.     /// <param name="xrName">扩展记录名</param>
  911.     /// <param name="varName">自定义系统变量名</param>
  912.     /// <param name="varValue">自定义系统变量值</param>
  913.     /// <returns></returns>
  914.     public static bool SetSysVar(string dictNames, string xrName, string varName, object varValue)
  915.     {
  916.       try
  917.       {
  918.         //smc.ed.WriteMessage("\nsXr.SetSysVar start varName={0},varValue={1}",varName,varValue);
  919.         ResultBuffer rBuf = sXr.GetResultBufferFromXrecord(dictNames, xrName);
  920.         rBuf = sXr.SetKeyValue(rBuf, varName, varValue, "", false);
  921.         if (rBuf != null)
  922.           return sXr.SetXrecord(dictNames, xrName, rBuf, true);
  923.         else
  924.           return false;
  925.       }
  926.       catch (System.Exception ex)
  927.       {
  928.         smc.WriteLine(ex);
  929.         return false;
  930.       }
  931.     }
  932.     /// <summary>
  933.     /// 获取自定义系统变量
  934.     /// 系统变量在扩展记录的数据结构KeyName=KeyValue
  935.     /// Version : 2008.11.05
  936.     /// </summary>
  937.     /// <param name="dictNames">数据词典路径</param>
  938.     /// <param name="xrName">扩展记录名</param>
  939.     /// <param name="varName">自定义系统变量名</param>
  940.     /// <param name="valueType">返回值数据类型</param>
  941.     /// <returns>成功返回自定义系统变量值,否则返回null</returns>
  942.     public static object GetSysVar(string dictNames, string xrName,string varName, System.Type valueType)
  943.     {
  944.       try
  945.       {
  946.         ResultBuffer resBuf = sXr.GetResultBufferFromXrecord(dictNames, xrName);
  947.         if (resBuf == null) return null;
  948.         return sXr.GetKeyValue(resBuf, varName, valueType, "");
  949.       }
  950.       catch (System.Exception ex)
  951.       {
  952.         smc.WriteLine(ex);
  953.         return null;
  954.       }
  955.     }
  956.     /// <summary>
  957.     /// 设置数据词典记录,若数据词典和词典记录还没有存在就创建,若已经存在则更改为输入值
  958.     /// Version : 2007.10.30 没有使用过
  959.     /// </summary>
  960.     /// <param name="rootDictionary">根数据词典</param>
  961.     /// <param name="dictionary">数据词典</param>
  962.     /// <param name="name">记录名</param>
  963.     /// <param name="Value_">值</param>
  964.     /// <returns></returns>
  965.     public static bool SetXrecord(string rootDictionary, string dictionary, string name, string[] Value_)
  966.     {
  967.       //smc.WriteLine("AddXRecord start " + dictionary+ "," + name + "," + Value_.ToString() , 0);                 
  968.       bool success = true;
  969.       try
  970.       {
  971.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  972.         {
  973.           DBDictionary sDict;
  974.           using (DBDictionary NOD = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForWrite, false))
  975.           {
  976.             try
  977.             {
  978.               sDict = (DBDictionary)ctrans.GetObject(NOD.GetAt(rootDictionary), OpenMode.ForWrite);
  979.             }
  980.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  981.             {
  982.               //smc.WriteLine(ex);
  983.               //NOD.UpgradeOpen();
  984.               sDict = new DBDictionary();
  985.               NOD.SetAt(rootDictionary, sDict);
  986.               ctrans.AddNewlyCreatedDBObject(sDict, true);
  987.             }
  988.           }
  989.           DBDictionary divDict;
  990.           try
  991.           {
  992.             divDict = (DBDictionary)ctrans.GetObject(sDict.GetAt(dictionary), OpenMode.ForWrite);
  993.           }
  994.           catch (Autodesk.AutoCAD.Runtime.Exception ex)
  995.           {
  996.             //smc.WriteLine(ex);
  997.             sDict.UpgradeOpen();
  998.             divDict = new DBDictionary(); //Division        doesn//t exist,        create one
  999.             sDict.SetAt(dictionary, divDict);
  1000.             ctrans.AddNewlyCreatedDBObject(divDict, true);
  1001.           }
  1002.           Xrecord mgrXRec;
  1003.           try
  1004.           {
  1005.             mgrXRec = (Xrecord)ctrans.GetObject(divDict.GetAt(name), OpenMode.ForWrite);
  1006.             //注意 : 在这里不能使用
  1007.             //mgrXRec.Data.Add(new TypedValue((int)DxfCode.Text, Value_.ToString()));
  1008.             //这里应该是一个Bug
  1009.             TypedValue[] tvs = new TypedValue[Value_.Length];
  1010.             for (int i = 0; i < Value_.Length; i++)
  1011.             {
  1012.               tvs[i] = new TypedValue((int)DxfCode.Text, Value_[i]);
  1013.             }
  1014.             mgrXRec.Data = new ResultBuffer(tvs);
  1015.           }
  1016.           catch (Autodesk.AutoCAD.Runtime.Exception ex)
  1017.           {
  1018.             //smc.WriteLine(ex);  
  1019.             mgrXRec = new Xrecord();
  1020.             TypedValue[] tvs = new TypedValue[Value_.Length];
  1021.             for (int i = 0; i < Value_.Length; i++)
  1022.             {
  1023.               tvs[i] = new TypedValue((int)DxfCode.Text, Value_[i]);
  1024.             }
  1025.             mgrXRec.Data = new ResultBuffer(tvs);
  1026.             divDict.SetAt(name, mgrXRec);
  1027.             ctrans.AddNewlyCreatedDBObject(mgrXRec, true);
  1028.           }
  1029.           ctrans.Commit();
  1030.         }
  1031.       }
  1032.       catch (System.Exception ex)
  1033.       {
  1034.         smc.WriteLine(ex);
  1035.         success = false;
  1036.       }
  1037.       return success;
  1038.     }
  1039.     /// <summary>
  1040.     /// 设置数据词典记录,若数据词典和词典记录还没有存在就创建,若已经存在则更改为输入值
  1041.     /// Version : 2007.10.30 没有使用过
  1042.     /// </summary>
  1043.     /// <param name="rootDictionary">根数据词典</param>
  1044.     /// <param name="dictionary">数据词典</param>
  1045.     /// <param name="name">记录名</param>
  1046.     /// <param name="recs">记录集合</param>
  1047.     /// <returns></returns>
  1048.     public static bool SetXrecord(string rootDictionary, string dictionary, string name, sRecords recs)
  1049.     {
  1050.       //smc.WriteLine("SetXrecord sRecords start " + dictionary + "," + name, 0);         
  1051.       bool success = true;
  1052.       try
  1053.       {
  1054.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1055.         {
  1056.           DBDictionary sDict;
  1057.           using (DBDictionary NOD = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForWrite, false))
  1058.           {
  1059.             try
  1060.             {
  1061.               sDict = (DBDictionary)ctrans.GetObject(NOD.GetAt(rootDictionary), OpenMode.ForWrite);
  1062.             }
  1063.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  1064.             {
  1065.               //smc.WriteLine(ex);
  1066.               //NOD.UpgradeOpen();
  1067.               sDict = new DBDictionary();
  1068.               NOD.SetAt(rootDictionary, sDict);
  1069.               ctrans.AddNewlyCreatedDBObject(sDict, true);
  1070.             }
  1071.           }
  1072.           DBDictionary divDict;
  1073.           try
  1074.           {
  1075.             divDict = (DBDictionary)ctrans.GetObject(sDict.GetAt(dictionary), OpenMode.ForWrite);
  1076.           }
  1077.           catch (Autodesk.AutoCAD.Runtime.Exception ex)
  1078.           {
  1079.             //smc.WriteLine(ex);
  1080.             //sDict.UpgradeOpen();
  1081.             divDict = new DBDictionary(); //Division        doesn//t exist,        create one
  1082.             sDict.SetAt(dictionary, divDict);
  1083.             ctrans.AddNewlyCreatedDBObject(divDict, true);
  1084.           }
  1085.           Xrecord mgrXRec;
  1086.           try
  1087.           {
  1088.             mgrXRec = (Xrecord)ctrans.GetObject(divDict.GetAt(name), OpenMode.ForWrite);
  1089.             mgrXRec.Data = recs.ToResultBuffer();
  1090.           }
  1091.           catch (Autodesk.AutoCAD.Runtime.Exception ex)
  1092.           {
  1093.             //smc.WriteLine(ex);  
  1094.             mgrXRec = new Xrecord();
  1095.             mgrXRec.Data = recs.ToResultBuffer();
  1096.             divDict.SetAt(name, mgrXRec);
  1097.             ctrans.AddNewlyCreatedDBObject(mgrXRec, true);
  1098.           }
  1099.           ctrans.Commit();
  1100.         }
  1101.       }
  1102.       catch (System.Exception ex)
  1103.       {
  1104.         //smc.WriteLine(ex);
  1105.         success = false;
  1106.       }
  1107.       return success;

  1108.     }
  1109.     /// <summary>
  1110.     /// 获取扩展记录链表
  1111.     /// Version : 2007.10.30  
  1112.     /// </summary>
  1113.     /// <param name="dictNames">数据词典全名数组</param>
  1114.     /// <param name="xrecordName">扩展记录名</param>
  1115.     /// <returns>成功返回扩展记录的数据链表,否则返回null</returns>
  1116.     public static ResultBuffer GetResultBufferFromXrecord(string[] dictNames, string xrecordName)
  1117.     {
  1118.       try
  1119.       {
  1120.         ResultBuffer resBuf = null;
  1121.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction()) //Start the transaction.
  1122.         {
  1123.           ObjectId dictId;
  1124.           DBDictionary curDict = (DBDictionary)ctrans.GetObject(smc.db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  1125.           for (int i = 0; i < dictNames.Length; i++)
  1126.           {
  1127.             if (curDict.Contains(dictNames[i]))
  1128.             {
  1129.               dictId = curDict.GetAt(dictNames[i]);
  1130.               curDict = (DBDictionary)ctrans.GetObject(dictId, OpenMode.ForRead);
  1131.             }
  1132.             else
  1133.             {
  1134.               ctrans.Dispose();
  1135.               return null;
  1136.             }
  1137.           }
  1138.           if (curDict.Contains(xrecordName))
  1139.           {
  1140.             Xrecord xRec = (Xrecord)ctrans.GetObject(curDict.GetAt(xrecordName), OpenMode.ForRead);
  1141.             resBuf = xRec.Data;
  1142.           }
  1143.           ctrans.Commit();
  1144.         }
  1145.         return resBuf;
  1146.       }
  1147.       catch (System.Exception ex)
  1148.       {
  1149.         smc.WriteLine(ex);
  1150.         return null;
  1151.       }
  1152.     }
  1153.     /// <summary>
  1154.     /// 获取扩展记录链表
  1155.     /// Version : 2007.10.30  
  1156.     /// </summary>
  1157.     /// <param name="dictNames">数据词典全名</param>
  1158.     /// <param name="xrecordName">扩展记录名</param>
  1159.     /// <returns>成功返回扩展记录的数据链表,否则返回null</returns>
  1160.     public static ResultBuffer GetResultBufferFromXrecord(string dictNames, string xrecordName)
  1161.     {
  1162.       try
  1163.       {
  1164.         char[] chars = { '.' };
  1165.         string[] nameArr = dictNames.Split(chars);
  1166.         return GetResultBufferFromXrecord(nameArr, xrecordName);
  1167.       }
  1168.       catch (System.Exception ex)
  1169.       {
  1170.         smc.WriteLine(ex);
  1171.         return null;
  1172.       }
  1173.     }
  1174.     /// <summary>
  1175.     /// 获取扩展记录链表
  1176.     /// Version : 2007.10.30  
  1177.     /// </summary>
  1178.     /// <param name="xrecordId">扩展记录ObjectId</param>
  1179.     /// <returns>成功返回扩展记录的数据链表,否则返回null</returns>
  1180.     public static ResultBuffer GetResultBufferFromXrecord(ObjectId xrecordId)
  1181.     {
  1182.       try
  1183.       {
  1184.         if (xrecordId == ObjectId.Null) return null;
  1185.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction()) //Start the transaction.
  1186.         {
  1187.           Xrecord xRec = (Xrecord)ctrans.GetObject(xrecordId, OpenMode.ForRead);
  1188.           ctrans.Commit();
  1189.           return xRec.Data;
  1190.         }
  1191.       }
  1192.       catch (System.Exception ex)
  1193.       {
  1194.         smc.WriteLine(ex);
  1195.         return null;
  1196.       }
  1197.     }
  1198.     /// <summary>
  1199.     /// 列出数据词典某个记录的值
  1200.     /// Version : 2007.10.30 没有使用
  1201.     /// </summary>
  1202.     /// <param name="rootDictionary"></param>
  1203.     /// <param name="dictionary">数字词典</param>
  1204.     /// <param name="name">记录名</param>
  1205.     /// <returns></returns>
  1206.     public static bool ListXrecord(string rootDictionary, string dictionary, string name)
  1207.     {
  1208.       //smc.WriteLine("ListXrecord start: " + dictionary + "   " + name, 0);
  1209.       bool success = true;
  1210.       Database cdb = HostApplicationServices.WorkingDatabase;
  1211.       using (Transaction ctrans = cdb.TransactionManager.StartTransaction()) //Start the transaction.
  1212.       {
  1213.         try
  1214.         {
  1215.           DBDictionary NOD = (DBDictionary)ctrans.GetObject(cdb.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  1216.           DBDictionary sDict = (DBDictionary)ctrans.GetObject(NOD.GetAt(rootDictionary), OpenMode.ForRead);
  1217.           DBDictionary divDict = (DBDictionary)ctrans.GetObject(sDict.GetAt(dictionary), OpenMode.ForRead);
  1218.           Xrecord xrec = (Xrecord)ctrans.GetObject(divDict.GetAt(name), OpenMode.ForRead);
  1219.           ResultBuffer rb = xrec.Data;
  1220.           TypedValue[] tvs = rb.AsArray();
  1221.           for (int i = 0; i < tvs.Length; i++)
  1222.           {
  1223.             smc.WriteLine("Value [" + i.ToString() + "] = " + tvs[i].Value.ToString(), 4);
  1224.           }
  1225.           ctrans.Commit();
  1226.         }
  1227.         catch (Autodesk.AutoCAD.Runtime.Exception ex)
  1228.         {
  1229.           // smc.WriteLine(ex);
  1230.           success = false;
  1231.         }
  1232.       }
  1233.       //smc.WriteLine("ListXrecord end " , 0);
  1234.       return success;
  1235.     }
  1236.     /// <summary>
  1237.     /// 列出数据词典的内容
  1238.     /// Version : 2007.10.30 较旧函数,应该可以替换或改进
  1239.     /// </summary>
  1240.     /// <param name="dbDictionary"></param>
  1241.     /// <param name="baseName"></param>
  1242.     public static void ListNameDictionary(DBDictionary dbDictionary, string baseName)
  1243.     {
  1244.       try
  1245.       {
  1246.         if (dbDictionary == null) return;
  1247.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1248.         {
  1249.           DBObject dbObj;
  1250.           foreach (System.Collections.DictionaryEntry dEntry in dbDictionary)
  1251.           {
  1252.             dbObj = (DBObject)ctrans.GetObject((ObjectId)dEntry.Value, OpenMode.ForRead, false);
  1253.             //smc.ed.WriteMessage("\ndbObj.Type = " + dbObj.GetType().FullName);
  1254.             //smc.ed.WriteMessage("\nKey = " + dEntry.Key.ToString());
  1255.             if (dbObj.GetType() == typeof(DBDictionary))
  1256.             {
  1257.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(DBDictionary)");
  1258.               ListNameDictionary((DBDictionary)dbObj, baseName + dEntry.Key.ToString() + ".");
  1259.             }
  1260.             else if (dbObj.GetType() == typeof(Xrecord))
  1261.             {
  1262.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(Xrecord)");
  1263.             }
  1264.             else if (dbObj.GetType() == typeof(Layout))
  1265.             {
  1266.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(Layout)");
  1267.             }
  1268.             else if (dbObj.GetType() == typeof(TableStyle))
  1269.             {
  1270.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(TableStyle)");
  1271.             }
  1272.             else if (dbObj.GetType() == typeof(MlineStyle))
  1273.             {
  1274.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(MlineStyle)");
  1275.             }
  1276.             else if (dbObj.GetType().ToString() == "Autodesk.AutoCAD.DatabaseServices.ImpDBObject")
  1277.             {
  1278.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(ImpDBObject)");
  1279.             }
  1280.             else if (dbObj.GetType() == typeof(DictionaryWithDefaultDictionary))
  1281.             {
  1282.               smc.ed.WriteMessage("\n" + baseName + dEntry.Key.ToString() + "(DictionaryWithDefaultDictionary)");
  1283.             }
  1284.           }
  1285.           ctrans.Commit();
  1286.         }
  1287.       }
  1288.       catch (System.Exception ex)
  1289.       {
  1290.         smc.ed.WriteMessage("\nadb.ListNameDictionary Error : " + ex.Message);
  1291.       }
  1292.     }
  1293.     #endregion Xrecord read and write
  1294.     #region XData read and write
  1295.     /// <summary>
  1296.     /// 向DBObject 对象附加扩展数据XData
  1297.     /// </summary>
  1298.     /// <param name="id">DBObject ObjectId</param>
  1299.     /// <param name="appName">注册应用程序名</param>   
  1300.     /// <param name="xData">扩展数据值</param>
  1301.     /// <param name="replace">是否替换原有扩展数据</param>
  1302.     /// <returns>成功返回true</returns>
  1303.     public static bool SetXData(ObjectId id, string appName, TypedValue xData, bool replace)
  1304.     {
  1305.       try
  1306.       {
  1307.         if (id == ObjectId.Null || xData == null) return false;
  1308.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1309.         {
  1310.           Entity ent = (Entity)ctrans.GetObject(id, OpenMode.ForWrite);
  1311.           RegAppTable rat = (RegAppTable)ctrans.GetObject(smc.db.RegAppTableId, OpenMode.ForWrite);
  1312.           if (!rat.Has(appName))
  1313.           {
  1314.             RegAppTableRecord ratr = new RegAppTableRecord();
  1315.             ratr.Name = appName;
  1316.             rat.Add(ratr);
  1317.             ctrans.AddNewlyCreatedDBObject(ratr, true);
  1318.           }
  1319.           ResultBuffer resBuf = ent.GetXDataForApplication(appName);
  1320.           if (resBuf == null || replace)
  1321.           {
  1322.             resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  1323.           }
  1324.           resBuf.Add(xData);
  1325.           ent.XData = resBuf;
  1326.           ctrans.Commit();
  1327.         }
  1328.         return true;
  1329.       }
  1330.       catch (System.Exception ex)
  1331.       {
  1332.         smc.WriteLine(ex);
  1333.         return false;
  1334.       }
  1335.     }
  1336.     /// <summary>
  1337.     /// 向DBObject 对象附加扩展数据XData
  1338.     /// Version : 2007.10.31
  1339.     /// </summary>
  1340.     /// <param name="objId">DBObject对象 ObjectId</param>
  1341.     /// <param name="appName">注册应用程序名</param>
  1342.     /// <param name="xData">扩展数据集合</param>
  1343.     /// <param name="replace">是否替换原有数据</param>
  1344.     /// <returns>成功返回true,否则返回false</returns>
  1345.     public static bool SetXData(ObjectId objId, string appName, ResultBuffer xData, bool replace)
  1346.     {
  1347.       if (objId == ObjectId.Null || xData == null || appName == "") return false;
  1348.       try
  1349.       {
  1350.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1351.         {
  1352.           Entity ent = (Entity)ctrans.GetObject(objId, OpenMode.ForWrite);
  1353.           RegAppTable raTable = (RegAppTable)ctrans.GetObject(smc.db.RegAppTableId, OpenMode.ForWrite);
  1354.           if (!raTable.Has(appName))
  1355.           {
  1356.             RegAppTableRecord ratRec = new RegAppTableRecord();
  1357.             ratRec.Name = appName;
  1358.             raTable.Add(ratRec);
  1359.             ctrans.AddNewlyCreatedDBObject(ratRec, true);
  1360.           }
  1361.           ResultBuffer resBuf = ent.GetXDataForApplication(appName);
  1362.           if (resBuf == null || replace)
  1363.           {
  1364.             resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  1365.           }
  1366.           TypedValue[] tValues = xData.AsArray();
  1367.           for (int i = 0; i < tValues.Length; i++)
  1368.           {
  1369.             resBuf.Add(tValues[i]);
  1370.           }
  1371.           ent.XData = resBuf;
  1372.           ctrans.Commit();
  1373.         }
  1374.         return true;
  1375.       }
  1376.       catch (System.Exception ex)
  1377.       {
  1378.         smc.WriteLine(ex);
  1379.         return false;
  1380.       }
  1381.     }
  1382.     public static bool SetXData(ObjectIdCollection idClt, string appName, ResultBuffer xData, bool replace)
  1383.     {
  1384.       if (idClt == null || idClt.Count == 0 || xData == null || appName == "") return false;
  1385.       try
  1386.       {
  1387.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1388.         {
  1389.           foreach (ObjectId objId in idClt)
  1390.           {
  1391.             if (objId != ObjectId.Null)
  1392.             {
  1393.               Entity ent = (Entity)ctrans.GetObject(objId, OpenMode.ForWrite);
  1394.               RegAppTable raTable = (RegAppTable)ctrans.GetObject(smc.db.RegAppTableId, OpenMode.ForWrite);
  1395.               if (!raTable.Has(appName))
  1396.               {
  1397.                 RegAppTableRecord ratRec = new RegAppTableRecord();
  1398.                 ratRec.Name = appName;
  1399.                 raTable.Add(ratRec);
  1400.                 ctrans.AddNewlyCreatedDBObject(ratRec, true);
  1401.               }
  1402.               ResultBuffer resBuf = ent.GetXDataForApplication(appName);
  1403.               if (resBuf == null || replace)
  1404.               {
  1405.                 resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  1406.               }
  1407.               TypedValue[] tValues = xData.AsArray();
  1408.               for (int i = 0; i < tValues.Length; i++)
  1409.               {
  1410.                 resBuf.Add(tValues[i]);
  1411.               }
  1412.               ent.XData = resBuf;
  1413.             }
  1414.           }
  1415.           ctrans.Commit();
  1416.         }
  1417.         return true;
  1418.       }
  1419.       catch (System.Exception ex)
  1420.       {
  1421.         smc.WriteLine(ex);
  1422.         return false;
  1423.       }
  1424.     }
  1425.     /// <summary>
  1426.     /// 对实体添加XData扩展数据
  1427.     /// </summary>
  1428.     /// <param name="ctrans">事务</param>
  1429.     /// <param name="ent">实体</param>
  1430.     /// <param name="appName">注册程序名</param>
  1431.     /// <param name="xData">扩展数据链表</param>
  1432.     /// <param name="replace">是否替换已有扩展数据</param>
  1433.     /// <returns>成功返回true,失败返回false</returns>
  1434.     public static bool SetXData(Transaction ctrans, Entity ent, string appName, ResultBuffer xData, bool replace)
  1435.     {
  1436.       if (ctrans == null || ent == null || xData == null) return false;
  1437.       try
  1438.       {
  1439.         if (!ent.IsWriteEnabled) return false;
  1440.         RegAppTable raTable = (RegAppTable)ctrans.GetObject(smc.db.RegAppTableId, OpenMode.ForWrite);
  1441.         if (!raTable.Has(appName))
  1442.         {
  1443.           RegAppTableRecord ratRec = new RegAppTableRecord();
  1444.           ratRec.Name = appName;
  1445.           raTable.Add(ratRec);
  1446.           ctrans.AddNewlyCreatedDBObject(ratRec, true);
  1447.         }
  1448.         ResultBuffer resBuf = ent.GetXDataForApplication(appName);
  1449.         if (resBuf == null || replace)
  1450.         {
  1451.           resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  1452.         }
  1453.         TypedValue[] tValues = xData.AsArray();
  1454.         for (int i = 0; i < tValues.Length; i++)
  1455.         {
  1456.           resBuf.Add(tValues[i]);
  1457.         }
  1458.         ent.XData = resBuf;
  1459.         return true;
  1460.       }
  1461.       catch (System.Exception ex)
  1462.       {
  1463.         smc.WriteLine(ex);
  1464.         return false;
  1465.       }
  1466.     }
  1467.     /// <summary>
  1468.     ///  
  1469.     /// </summary>
  1470.     /// <param name="dbClt"></param>
  1471.     /// <param name="appName"></param>
  1472.     /// <param name="xData"></param>
  1473.     /// <param name="replace"></param>
  1474.     /// <returns></returns>
  1475.     public static bool SetXData(Transaction ctrans, DBObjectCollection dbClt, string appName, ResultBuffer xData, bool replace)
  1476.     {
  1477.       if (dbClt == null || xData == null || appName == "") return false;
  1478.       try
  1479.       {      
  1480.           RegAppTable raTable = (RegAppTable)ctrans.GetObject(smc.db.RegAppTableId, OpenMode.ForRead);
  1481.           if (!raTable.Has(appName))
  1482.           {
  1483.             raTable.UpgradeOpen();
  1484.             RegAppTableRecord ratRec = new RegAppTableRecord();
  1485.             ratRec.Name = appName;
  1486.             raTable.Add(ratRec);
  1487.             ctrans.AddNewlyCreatedDBObject(ratRec, true);
  1488.           }      
  1489.         foreach (DBObject dbObj in dbClt)
  1490.         {
  1491.           if (dbObj != null && dbObj is Entity && dbObj.IsWriteEnabled)
  1492.           {
  1493.             Entity ent = (Entity)dbObj;
  1494.             ResultBuffer resBuf = ent.GetXDataForApplication(appName);
  1495.             if (resBuf == null || replace)
  1496.             {
  1497.               resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  1498.             }
  1499.             TypedValue[] tValues = xData.AsArray();
  1500.             for (int i = 0; i < tValues.Length; i++)
  1501.             {
  1502.               resBuf.Add(tValues[i]);
  1503.             }
  1504.             ent.XData = resBuf;
  1505.           }
  1506.         }
  1507.         return true;
  1508.       }
  1509.       catch (System.Exception ex)
  1510.       {
  1511.         smc.WriteLine(ex);
  1512.         return false;
  1513.       }
  1514.     }
  1515.     /// <summary>
  1516.     /// 获取ObjectId的XData,
  1517.     /// Version : 2007.10.31
  1518.     /// </summary>
  1519.     /// <param name="objId">ObjectId</param>
  1520.     /// <param name="appName">注册程序名</param>
  1521.     /// <returns>成功返回XData的ResultBuffer链表,否则返回null</returns>
  1522.     public static ResultBuffer GetXData(ObjectId objId, string appName)
  1523.     {
  1524.       try
  1525.       {
  1526.         if (objId == ObjectId.Null) return null;
  1527.         ResultBuffer resBuf = null;
  1528.         using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1529.         {
  1530.           Entity ent = (Entity)ctrans.GetObject(objId, OpenMode.ForRead);
  1531.           resBuf = ent.GetXDataForApplication(appName);
  1532.           ctrans.Commit();
  1533.         }
  1534.         return resBuf;
  1535.       }
  1536.       catch (System.Exception ex)
  1537.       {
  1538.         smc.WriteLine(ex);
  1539.         return null;
  1540.       }
  1541.     }
  1542.     /// <summary>
  1543.     /// 列出id实体所附加的全部扩展数据
  1544.     /// </summary>
  1545.     /// <param name="id">实体的ObjectId</param>
  1546.     public static void ShowXData(ObjectId id)
  1547.     {
  1548.       if (id == ObjectId.Null) return;
  1549.       using (Transaction ctrans = smc.db.TransactionManager.StartTransaction())
  1550.       {
  1551.         using (Entity ent = (Entity)ctrans.GetObject(id, OpenMode.ForRead))
  1552.         {
  1553.           ResultBuffer rb = ent.XData;
  1554.           if (rb != null)
  1555.           {
  1556.             TypedValue[] tvs = rb.AsArray();
  1557.             smc.ed.WriteMessage("\nObject  XData :");
  1558.             for (int i = 0; i < tvs.Length; i++)
  1559.             {
  1560.               smc.ed.WriteMessage("\n    " + tvs[i].TypeCode.ToString() + " : " + tvs[i].Value.ToString());
  1561.             }
  1562.           }
  1563.           else
  1564.             smc.ed.WriteMessage("\nSelect Object hasn't XData !");
  1565.         }
  1566.       }
  1567.     }
  1568.     #endregion XData read and write

  1569.   }
  1570. }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 43个

财富等级: 招财进宝

发表于 2014-10-24 01:26:31 | 显示全部楼层
这是???看不懂。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 00:02 , Processed in 0.419545 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表