明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17432|回复: 19

[基础] [原创]DBTransaction类

  [复制链接]
发表于 2009-6-4 12:45:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-6-6 13:51:44 编辑

其实很早前就在论坛里贴过早期的版本,不算新内容
没有做详细的测试,还希望各位朋友指正:)
简单的注释了下:)
DBTransaction.cs
  1. #define AC2008
  2. using System;
  3. using System.IO;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Collections.Specialized;
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Geometry;
  11. namespace TlsCad
  12. {
  13.     public class DBTransaction : IDisposable
  14.     {
  15.         private Database m_Database;
  16.         private Transaction m_Transaction;
  17.         private bool m_Commit = false;
  18.         private BlockTableRecord m_BlockTableRecord;
  19.         private BlockTable m_BlockTable;
  20.         private TextStyleTable m_TextStyleTable;
  21.         private LinetypeTable m_LinetypeTable;
  22.         private RegAppTable m_RegAppTable;
  23.         private LayerTable m_LayerTable;
  24.         private UcsTable m_UcsTable;
  25.         private ViewTable m_ViewTable;
  26.         private ViewportTable m_ViewportTable;
  27.         private DrawOrderTable m_DrawOrderTable;
  28.         private DBDictionary m_GroupDictionary;
  29.         //事务相关
  30.         #region Tran
  31.         //事务初始化,并只读方式打开块表
  32.         private void Initialize()
  33.         {
  34.             try
  35.             {
  36.                 m_Transaction = m_Database.TransactionManager.StartTransaction();
  37.                 m_BlockTable = (BlockTable)m_Transaction.GetObject(m_Database.BlockTableId, OpenMode.ForRead, false);
  38.             }
  39.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  40.             {
  41.                 CadHelper.InfoMessageBox(ex.Message);
  42.             }
  43.         }
  44.         //创建当前活动文档的事务(默认提交)
  45.         public DBTransaction()
  46.         {
  47.             m_Database = HostApplicationServices.WorkingDatabase;
  48.             Initialize();
  49.         }
  50.         //创建当前活动文档的事务
  51.         //commit = true 提交事务
  52.         //commit = false 不提交
  53.         public DBTransaction(bool commit)
  54.         {
  55.             m_Commit = !commit;
  56.             m_Database = HostApplicationServices.WorkingDatabase;
  57.             Initialize();
  58.         }
  59.         //创建指定数据库的事务,一般用于临时数据库(默认提交)
  60.         public DBTransaction(Database database)
  61.         {
  62.             m_Database = database;
  63.             Initialize();
  64.         }
  65.         //创建指定数据库的事务
  66.         //commit = true 提交事务
  67.         //commit = false 不提交
  68.         public DBTransaction(Database database, bool commit)
  69.         {
  70.             m_Commit = !commit;
  71.             m_Database = database;
  72.             Initialize();
  73.         }
  74.         //创建临时数据库的事务,并读入指定的文档(默认提交)
  75.         public DBTransaction(string fileName)
  76.         {
  77.             try
  78.             {
  79.                 m_Database = new Database(false, true);
  80.                 m_Database.ReadDwgFile(fileName, FileShare.Read, true, null);
  81.                 Initialize();
  82.             }
  83.             catch
  84.             { }
  85.         }
  86.         //创建临时数据库的事务,并读入指定的文档
  87.         //commit = true 提交事务
  88.         //commit = false 不提交
  89.         public DBTransaction(string DwgFileName, bool commit)
  90.         {
  91.             m_Commit = !commit;
  92.             try
  93.             {
  94.                 m_Database = new Database(false, true);
  95.                 m_Database.ReadDwgFile(DwgFileName, FileShare.Read, true, null);
  96.                 Initialize();
  97.             }
  98.             catch
  99.             { }
  100.         }
  101.         //
  102.         void IDisposable.Dispose()
  103.         {
  104.             Commit();
  105.             m_Transaction.Dispose();
  106.         }
  107.         //按事务初始化参数决定事物是否提交
  108.         public void Commit()
  109.         {
  110.             if (!m_Commit)
  111.             {
  112.                 m_Transaction.Commit();
  113.                 m_Commit = true;
  114.             }
  115.         }
  116.         //撤销事务
  117.         public void Abort()
  118.         {
  119.             m_Transaction.Abort();
  120.         }
  121.         #endregion
  122.         //在符号表中获取对应键值的记录Id
  123.         //弥补索引器的Bug
  124.         //即会获取已清除并存在符号表的记录
  125.         //但2010版该Bug已消除
  126.         public ObjectId GetIdFromSymbolTable(SymbolTable st, string key)
  127.         {
  128.             if (st.Has(key))
  129.             {
  130.                 ObjectId idres = st[key];
  131.                 if (!idres.IsErased)
  132.                     return idres;
  133. #if AC2008
  134.                 foreach (ObjectId id in st)
  135.                 {
  136.                     if (!id.IsErased)
  137.                     {
  138.                         SymbolTableRecord str = (SymbolTableRecord)m_Transaction.GetObject(id, OpenMode.ForRead);
  139.                         if (str.Name == key)
  140.                             return id;
  141.                     }
  142.                 }
  143. #endif
  144.             }
  145.             return ObjectId.Null;
  146.         }
  147.         //属性
  148.         #region Properties
  149.         public Database Database
  150.         {
  151.             get { return m_Database; }
  152.         }
  153.         public Transaction Transaction
  154.         {
  155.             get { return m_Transaction; }
  156.         }
  157.         public BlockTableRecord CurrentBlockTableRecord
  158.         {
  159.             get { return m_BlockTableRecord; }
  160.         }
  161.         public BlockTable BlockTable
  162.         {
  163.             get { return m_BlockTable; }
  164.         }
  165.         public LayerTable LayerTable
  166.         {
  167.             get { return m_LayerTable; }
  168.         }
  169.         public TextStyleTable TextStyleTable
  170.         {
  171.             get { return m_TextStyleTable; }
  172.         }
  173.         public RegAppTable RegAppTable
  174.         {
  175.             get { return m_RegAppTable; }
  176.         }
  177.         public LinetypeTable LinetypeTable
  178.         {
  179.             get { return m_LinetypeTable; }
  180.         }
  181.         public UcsTable UcsTable
  182.         {
  183.             get { return m_UcsTable; }
  184.         }
  185.         public ViewTable ViewTable
  186.         {
  187.             get { return m_ViewTable; }
  188.         }
  189.         public ViewportTable ViewportTable
  190.         {
  191.             get { return m_ViewportTable; }
  192.         }
  193.         public DrawOrderTable DrawOrderTable
  194.         {
  195.             get { return m_DrawOrderTable; }
  196.         }
  197.         public DBDictionary GroupDictionary
  198.         {
  199.             get { return m_GroupDictionary; }
  200.         }
  201.         #endregion
  202.         //块表记录
  203.         #region BlockTableRecord
  204.         
  205.         public BlockTableRecord OpenBlockTableRecord(ObjectId id, OpenMode openmode)
  206.         {
  207.             m_BlockTableRecord = (BlockTableRecord)m_Transaction.GetObject(
  208.                 id,
  209.                 openmode,
  210.                 false);
  211.             return m_BlockTableRecord;
  212.         }
  213.         public BlockTableRecord OpenBlockTableRecord(ObjectId id)
  214.         {
  215.             return OpenBlockTableRecord(id, OpenMode.ForWrite);
  216.         }
  217.         public BlockTableRecord OpenBlockTableRecord(string name, OpenMode openmode)
  218.         {
  219.             ObjectId id = GetIdFromSymbolTable(m_BlockTable, name);
  220.             if (id == ObjectId.Null)
  221.                 return null;
  222.             return OpenBlockTableRecord(id, openmode);
  223.         }
  224.         public BlockTableRecord OpenBlockTableRecord(string name)
  225.         {
  226.             return OpenBlockTableRecord(m_BlockTable[name], OpenMode.ForWrite);
  227.         }
  228.         public void OpenCurrentSpace(OpenMode openmode)
  229.         {
  230.             OpenBlockTableRecord(m_Database.CurrentSpaceId, openmode);
  231.         }
  232.         public void OpenCurrentSpace()
  233.         {
  234.             OpenCurrentSpace(OpenMode.ForWrite);
  235.         }
  236.         public void OpenPaperSpace(OpenMode openmode)
  237.         {
  238.             OpenBlockTableRecord(BlockTableRecord.PaperSpace, openmode);
  239.         }
  240.         public void OpenPaperSpace()
  241.         {
  242.             OpenPaperSpace(OpenMode.ForWrite);
  243.         }
  244.         public void OpenModelSpace(OpenMode openmode)
  245.         {
  246.             OpenBlockTableRecord(BlockTableRecord.ModelSpace, openmode);
  247.         }
  248.         public void OpenModelSpace()
  249.         {
  250.             OpenModelSpace(OpenMode.ForWrite);
  251.         }
  252.         public DBObject GetObject(ObjectId id, OpenMode openmode)
  253.         {
  254.             return m_Transaction.GetObject(id, openmode, false);
  255.         }
  256.         #endregion
  257.         //层表
  258.         #region LayerTable
  259.         public LayerTable OpenLayerTable(OpenMode openmode)
  260.         {
  261.             m_LayerTable = (LayerTable)m_Transaction.GetObject(
  262.                 m_Database.LayerTableId,
  263.                 openmode,
  264.                 false);
  265.             return m_LayerTable;
  266.         }
  267.         public LayerTable OpenLayerTable()
  268.         {
  269.             return OpenLayerTable(OpenMode.ForWrite);
  270.         }
  271.         public ObjectId AddLayer(string name, Autodesk.AutoCAD.Colors.Color color, ObjectId linetypeid, LineWeight lineweight)
  272.         {
  273.             ObjectId id = GetIdFromSymbolTable(m_LayerTable, name);
  274.             if (id == ObjectId.Null)
  275.             {
  276.                 LayerTableRecord layer = new LayerTableRecord();
  277.                 layer.Name = name;
  278.                 layer.Color = color;
  279.                 layer.LinetypeObjectId = linetypeid;
  280.                 layer.LineWeight = lineweight;
  281.                 m_LayerTable.UpgradeOpen();
  282.                 id = m_LayerTable.Add(layer);
  283.                 m_Transaction.AddNewlyCreatedDBObject(layer, true);
  284.             }
  285.             return id;
  286.         }
  287.         #endregion
  288.         //文字式样表
  289.         #region TextStyleTable
  290.         public TextStyleTable OpenTextStyleTable(OpenMode openmode)
  291.         {
  292.             m_TextStyleTable = (TextStyleTable)m_Transaction.GetObject(
  293.                 m_Database.TextStyleTableId,
  294.                 openmode,
  295.                 false);
  296.             return m_TextStyleTable;
  297.         }
  298.         public TextStyleTable OpenTextStyleTable()
  299.         {
  300.             return OpenTextStyleTable(OpenMode.ForWrite);
  301.         }
  302.         public ObjectId AddTextStyle(string name, string smallfont, string bigfont, double height, double xscale)
  303.         {
  304.             ObjectId id = GetIdFromSymbolTable(m_TextStyleTable, name);
  305.             if (id == ObjectId.Null)
  306.             {
  307.                 TextStyleTableRecord tstr = new TextStyleTableRecord();
  308.                 tstr.Name = name;
  309.                 tstr.FileName = smallfont;
  310.                 tstr.BigFontFileName = bigfont;
  311.                 tstr.TextSize = height;
  312.                 tstr.XScale = xscale;
  313.                 m_TextStyleTable.UpgradeOpen();
  314.                 id = m_TextStyleTable.Add(tstr);
  315.                 m_Transaction.AddNewlyCreatedDBObject(tstr, true);
  316.             }
  317.             return id;
  318.         }
  319.         #endregion
  320.         //注册应用程序
  321.         #region RegAppTable
  322.         public RegAppTable OpenRegAppTable(OpenMode openmode)
  323.         {
  324.             m_RegAppTable = (RegAppTable)m_Transaction.GetObject(
  325.                 m_Database.RegAppTableId,
  326.                 openmode,
  327.                 false);
  328.             return m_RegAppTable;
  329.         }
  330.         public RegAppTable OpenRegAppTable()
  331.         {
  332.             return OpenRegAppTable(OpenMode.ForWrite);
  333.         }
  334.         public ObjectId RegApp(string name)
  335.         {
  336.             ObjectId id = GetIdFromSymbolTable(m_RegAppTable, name);
  337.             if (id == ObjectId.Null)
  338.             {
  339.                 RegAppTableRecord regapp = new RegAppTableRecord();
  340.                 regapp.Name = name;
  341.                 id = m_RegAppTable.Add(regapp);
  342.                 m_Transaction.AddNewlyCreatedDBObject(regapp, true);
  343.             }
  344.             return id;
  345.         }
  346.         #endregion
  347.         //线型表
  348.         #region LinetypeTable
  349.         public LinetypeTable OpenLinetypeTable(OpenMode openmode)
  350.         {
  351.             m_LinetypeTable = (LinetypeTable)m_Transaction.GetObject(
  352.                 m_Database.LinetypeTableId,
  353.                 openmode,
  354.                 false);
  355.             return m_LinetypeTable;
  356.         }
  357.         public LinetypeTable OpenLinetypeTable()
  358.         {
  359.             return OpenLinetypeTable(OpenMode.ForWrite);
  360.         }
  361.         public SelectionSet SelectByLineWeight(LineWeight lineWeight)
  362.         {
  363.             List<TypedValue> filter = new List<TypedValue>();
  364.             filter.Add(new TypedValue(370, lineWeight));
  365.             OpenLayerTable(OpenMode.ForRead);
  366.             List<string> lays = new List<string>();
  367.             foreach (ObjectId id in LayerTable)
  368.             {
  369.                 LayerTableRecord ltr = (LayerTableRecord)GetObject(id, OpenMode.ForRead);
  370.                 if (ltr.LineWeight == lineWeight)
  371.                 {
  372.                     lays.Add(ltr.Name);
  373.                 }
  374.             }
  375.             if (lays.Count > 0)
  376.             {
  377.                 string s = string.Join(",", lays.ToArray());
  378.                 filter.Insert(0, new TypedValue(-4, "<or"));
  379.                 filter.Add(new TypedValue(-4, "<and"));
  380.                 filter.Add(new TypedValue(8, s));
  381.                 filter.Add(new TypedValue(370, LineWeight.ByLayer));
  382.                 filter.Add(new TypedValue(-4, "and>"));
  383.                 filter.Add(new TypedValue(-4, "or>"));
  384.             }
  385.             PromptSelectionResult res = CadHelper.Editor.SelectAll(new SelectionFilter(filter.ToArray()));
  386.             return res.Value;
  387.         }
  388.         #endregion
  389.         //用户坐标系
  390.         #region UcsTable
  391.         public UcsTable OpenUcsTable(OpenMode openmode)
  392.         {
  393.             m_UcsTable = (UcsTable)m_Transaction.GetObject(
  394.                 m_Database.UcsTableId,
  395.                 openmode,
  396.                 false);
  397.             return m_UcsTable;
  398.         }
  399.         public UcsTable OpenUcsTable()
  400.         {
  401.             return OpenUcsTable(OpenMode.ForWrite);
  402.         }
  403.         #endregion
  404.         //视图
  405.         #region ViewTable
  406.         public ViewTable OpenViewTable(OpenMode openmode)
  407.         {
  408.             m_ViewTable = (ViewTable)m_Transaction.GetObject(
  409.                 m_Database.ViewTableId,
  410.                 openmode,
  411.                 false);
  412.             return m_ViewTable;
  413.         }
  414.         public ViewTable OpenViewTable()
  415.         {
  416.             return OpenViewTable(OpenMode.ForWrite);
  417.         }
  418.         #endregion
  419.         //视口
  420.         #region ViewportTable
  421.         public ViewportTable OpenViewportTable(OpenMode openmode)
  422.         {
  423.             m_ViewportTable = (ViewportTable)m_Transaction.GetObject(
  424.                 m_Database.ViewportTableId,
  425.                 openmode,
  426.                 false);
  427.             return m_ViewportTable;
  428.         }
  429.         public ViewportTable OpenViewportTable()
  430.         {
  431.             return OpenViewportTable(OpenMode.ForWrite);
  432.         }
  433.         #endregion
  434.         //调整实体显示
  435.         #region DrawOrderTable
  436.         public DrawOrderTable OpenDrawOrderTable(OpenMode openmode)
  437.         {
  438.             m_DrawOrderTable = (DrawOrderTable)m_Transaction.GetObject(
  439.                 m_BlockTableRecord.DrawOrderTableId,
  440.                 openmode,
  441.                 false);
  442.             return m_DrawOrderTable;
  443.         }
  444.         public DrawOrderTable OpenDrawOrderTable()
  445.         {
  446.             return OpenDrawOrderTable(OpenMode.ForWrite);
  447.         }
  448.         #endregion
  449.         //编组字典
  450.         #region GroupDictionary
  451.         public DBDictionary OpenGroupDictionary(OpenMode openmode)
  452.         {
  453.             m_GroupDictionary = (DBDictionary)m_Transaction.GetObject(
  454.                 m_Database.GroupDictionaryId,
  455.                 openmode,
  456.                 false);
  457.             return m_GroupDictionary;
  458.         }
  459.         public DBDictionary OpenGroupDictionary()
  460.         {
  461.             return OpenGroupDictionary(OpenMode.ForWrite);
  462.         }
  463.         public ObjectId AddGroup(string name, ObjectIdCollection ids)
  464.         {
  465.             if (m_GroupDictionary.Contains(name))
  466.             {
  467.                 return ObjectId.Null;
  468.             }
  469.             else
  470.             {
  471.                 m_GroupDictionary.UpgradeOpen();
  472.                 Group g = new Group();
  473.                 g.Append(ids);
  474.                 m_GroupDictionary.SetAt(name, g);
  475.                 m_Transaction.AddNewlyCreatedDBObject(g, true);
  476.                 return g.ObjectId;
  477.             }
  478.         }
  479.         public List<Group> GetGroups(Entity ent)
  480.         {
  481.             List<Group> gs = new List<Group>();
  482.             foreach (DBDictionaryEntry obj in m_GroupDictionary)
  483.             {
  484.                 Group g =
  485.                     (Group)m_Transaction.GetObject(
  486.                     obj.Value,
  487.                     OpenMode.ForRead,
  488.                     false);
  489.                 if (g.Has(ent))
  490.                     gs.Add(g);
  491.             }
  492.             return gs;
  493.         }
  494.         #endregion
  495.         //在当前块表记录中加入实体
  496.         #region Add Entity
  497.         public ObjectId AddEntity(Entity entity)
  498.         {
  499.             ObjectId id = m_BlockTableRecord.AppendEntity(entity);
  500.             m_Transaction.AddNewlyCreatedDBObject(entity, true);
  501.             return id;
  502.         }
  503.         public ObjectId[] AddEntity(DBObjectCollection objs)
  504.         {
  505.             ObjectId[] ids = new ObjectId[objs.Count];
  506.             for (int i = 0; i < objs.Count; i++)
  507.             {
  508.                 ids[i] = this.AddEntity((Entity)objs[i]);
  509.             }
  510.             return ids;
  511.         }
  512.         public ObjectId[] AddEntity(DBObject[] objs)
  513.         {
  514.             ObjectId[] ids = new ObjectId[objs.Length];
  515.             for (int i = 0; i < objs.Length; i++)
  516.             {
  517.                 ids[i] = this.AddEntity((Entity)objs[i]);
  518.             }
  519.             return ids;
  520.         }
  521.         public ObjectId[] AddEntity(List<DBObject> objs)
  522.         {
  523.             ObjectId[] ids = new ObjectId[objs.Count];
  524.             for (int i = 0; i < objs.Count; i++)
  525.             {
  526.                 ids[i] = this.AddEntity((Entity)objs[i]);
  527.             }
  528.             return ids;
  529.         }
  530.         public ObjectId[] AddEntity(List<Entity> objs)
  531.         {
  532.             ObjectId[] ids = new ObjectId[objs.Count];
  533.             for (int i = 0; i < objs.Count; i++)
  534.             {
  535.                 ids[i] = this.AddEntity(objs[i]);
  536.             }
  537.             return ids;
  538.         }
  539.         #endregion
  540.         //删除实体
  541.         #region Remove Entity
  542.         public bool Remove(ObjectId id)
  543.         {
  544.             try
  545.             {
  546.                 DBObject obj = m_Transaction.GetObject(id, OpenMode.ForWrite);
  547.                 obj.Erase(true);
  548.                 return true;
  549.             }
  550.             catch
  551.             { }
  552.             return false;
  553.         }
  554.         public bool Remove(ObjectIdCollection ids)
  555.         {
  556.             try
  557.             {
  558.                 foreach (ObjectId id in ids)
  559.                 {
  560.                     DBObject obj;
  561.                     obj = m_Transaction.GetObject(id, OpenMode.ForWrite);
  562.                     obj.Erase(true);
  563.                 }
  564.                 return true;
  565.             }
  566.             catch
  567.             { }
  568.             return false;
  569.         }
  570.         public bool Remove(ObjectId[] ids)
  571.         {
  572.             try
  573.             {
  574.                 foreach (ObjectId id in ids)
  575.                 {
  576.                     DBObject obj;
  577.                     obj = m_Transaction.GetObject(id, OpenMode.ForWrite);
  578.                     obj.Erase(true);
  579.                 }
  580.                 return true;
  581.             }
  582.             catch
  583.             { }
  584.             return false;
  585.         }
  586.         public void Clear()
  587.         {
  588.             foreach (ObjectId id in m_BlockTableRecord)
  589.             {
  590.                 DBObject obj = GetObject(id, OpenMode.ForWrite);
  591.                 obj.Erase();
  592.             }
  593.         }
  594.         #endregion
  595.         //块操作相关
  596.         #region Block
  597.         public ObjectId AddBlock(string name)
  598.         {
  599.             ObjectId id = GetIdFromSymbolTable(m_BlockTable, name);
  600.             if (id == ObjectId.Null)
  601.             {
  602.                 m_BlockTable.UpgradeOpen();
  603.                 BlockTableRecord btr = new BlockTableRecord();
  604.                 btr.Name = name;
  605.                 id = m_BlockTable.Add(btr);
  606.                 m_Transaction.AddNewlyCreatedDBObject(btr, true);
  607.             }
  608.             return id;
  609.         }
  610.         public Dictionary<AttributeDefinition, AttributeReference> AppendAttribToBlock(ObjectId blkrefid, List<string> atts)
  611.         {
  612.             BlockReference blkref = (BlockReference)m_Transaction.GetObject(blkrefid, OpenMode.ForWrite);
  613.             return AppendAttribToBlock(blkref, atts);
  614.         }
  615.         public Dictionary<AttributeDefinition, AttributeReference> AppendAttribToBlock(BlockReference blkref, List<string> atts)
  616.         {
  617.             BlockTableRecord blkdef = (BlockTableRecord)m_Transaction.GetObject(blkref.BlockTableRecord, OpenMode.ForRead);
  618.             int i = 0;
  619.             if (blkdef.HasAttributeDefinitions)
  620.             {
  621.                 Dictionary<AttributeDefinition, AttributeReference> attribs = new Dictionary<AttributeDefinition, AttributeReference>();
  622.                 foreach (ObjectId id in blkdef)
  623.                 {
  624.                     DBObject ent = GetObject(id, OpenMode.ForRead);
  625.                     if (ent is AttributeDefinition)
  626.                     {
  627.                         AttributeDefinition attdef = (AttributeDefinition)ent;
  628.                         AttributeReference attref = new AttributeReference();
  629.                         attref.SetAttributeFromBlock(attdef, blkref.BlockTransform);
  630.                         if (i < atts.Count)
  631.                             attref.TextString = atts[i];
  632.                         else
  633.                             attref.TextString = attdef.TextString;
  634.                         i++;
  635.                         blkref.AttributeCollection.AppendAttribute(attref);
  636.                         m_Transaction.AddNewlyCreatedDBObject(attref, true);
  637.                         attribs.Add(attdef, attref);
  638.                     }
  639.                 }
  640.                 return attribs;
  641.             }
  642.             return null;
  643.         }
  644.         public Dictionary<AttributeDefinition, AttributeReference> AppendAttribToBlock(ObjectId blkrefid, List<AttributeDefinition> atts)
  645.         {
  646.             BlockReference blkref = (BlockReference)m_Transaction.GetObject(blkrefid, OpenMode.ForWrite);
  647.             return AppendAttribToBlock(blkref, atts);
  648.         }
  649.         public Dictionary<AttributeDefinition, AttributeReference> AppendAttribToBlock(BlockReference blkref, List<AttributeDefinition> atts)
  650.         {
  651.             Dictionary<AttributeDefinition, AttributeReference> attribs = new Dictionary<AttributeDefinition, AttributeReference>();
  652.             for (int i = 0; i < atts.Count; i++)
  653.             {
  654.                 AttributeDefinition attdef = atts[i];
  655.                 AttributeReference attref = new AttributeReference();
  656.                 attref.SetAttributeFromBlock(attdef, blkref.BlockTransform);
  657.                 //attref.TransformBy(blkref.BlockTransform);
  658.                 attref.TextString = attdef.TextString;
  659.                 blkref.AttributeCollection.AppendAttribute(attref);
  660.                 m_Transaction.AddNewlyCreatedDBObject(attref, true);
  661.             }
  662.             return attribs;
  663.         }
  664.         public ObjectId InsertBlock(ObjectId blkdefid, List<string> atts)
  665.         {
  666.             BlockReference blkref = new BlockReference(Point3d.Origin, blkdefid);
  667.             ObjectId id = AddEntity(blkref);
  668.             BlockRefJig jig = new BlockRefJig(blkref, AppendAttribToBlock(blkref, atts));
  669.             jig.SetPromptCounter(0);
  670.             PromptResult res = CadHelper.Editor.Drag(jig);
  671.             if (res.Status == PromptStatus.OK)
  672.             {
  673.                 jig.SetPromptCounter(1);
  674.                 res = CadHelper.Editor.Drag(jig);
  675.                 if (res.Status == PromptStatus.OK)
  676.                 {
  677.                     return id;
  678.                 }
  679.             }
  680.             blkref.Erase();
  681.             return ObjectId.Null;
  682.         }
  683.         public ObjectId InsertBlock(string name, List<string> attribs)
  684.         {
  685.             return InsertBlock(m_BlockTable[name], attribs);
  686.         }
  687.         public bool GetBlockDefFromFile(string filename, string blkdefname, bool over)
  688.         {
  689.             try
  690.             {
  691.                 bool has = m_BlockTable.Has(blkdefname);
  692.                 if ((has && over) || !has)
  693.                 {
  694.                     using (DBTransaction t = new DBTransaction(filename))
  695.                     {
  696.                         ObjectId id = t.BlockTable[blkdefname];
  697.                         BlockTableRecord btr =
  698.                             (BlockTableRecord)t.GetObject(id, OpenMode.ForRead);
  699.                         if (!btr.IsAnonymous && !btr.IsLayout)
  700.                         {
  701.                             ObjectIdCollection ids = new ObjectIdCollection();
  702.                             ids.Add(t.BlockTable[blkdefname]);
  703.                             t.Database.Wblock(
  704.                                 m_Database,
  705.                                 ids,
  706.                                 new Point3d(),
  707.                                 DuplicateRecordCloning.Replace
  708.                                 );
  709.                         }
  710.                     }
  711.                 }
  712.                 return true;
  713.             }
  714.             catch
  715.             { }
  716.             return false;
  717.         }
  718.         public bool GetBlockDefFromFile(string filename, bool over)
  719.         {
  720.             try
  721.             {
  722.                 FileInfo fi = new FileInfo(filename);
  723.                 string blkdefname = fi.Name;
  724.                 if (blkdefname.Contains("."))
  725.                 {
  726.                     blkdefname = blkdefname.Substring(0, blkdefname.LastIndexOf('.'));
  727.                 }
  728.                 bool has = m_BlockTable.Has(blkdefname);
  729.                 if ((has && over) || !has)
  730.                 {
  731.                     Database db = new Database();
  732.                     db.ReadDwgFile(filename, FileShare.Read, true, null);
  733.                     m_Database.Insert(BlockTableRecord.ModelSpace, blkdefname, db, false);
  734.                 }
  735.                 return true;
  736.             }
  737.             catch
  738.             { }
  739.             return false;
  740.         }
  741.         #endregion
  742.         //字典
  743.         #region XRecord
  744.         public DBDictionary GetSubDict(DBDictionary dict, bool createsubdict, params string[] dictnames)
  745.         {
  746.             if (createsubdict)
  747.             {
  748.                 dict.UpgradeOpen();
  749.                 dict.TreatElementsAsHard = true;
  750.             }
  751.             for (int i = 0; i < dictnames.Length; i++)
  752.             {
  753.                 string name = dictnames[i];
  754.                 if (dict.Contains(name))
  755.                 {
  756.                     dict =
  757.                         (DBDictionary)m_Transaction.GetObject(
  758.                             dict.GetAt(name),
  759.                             OpenMode.ForRead,
  760.                             false);
  761.                 }
  762.                 else
  763.                 {
  764.                     if (createsubdict)
  765.                     {
  766.                         dict.UpgradeOpen();
  767.                         DBDictionary subdict = new DBDictionary();
  768.                         dict.SetAt(name, subdict);
  769.                         m_Transaction.AddNewlyCreatedDBObject(subdict, true);
  770.                         dict = subdict;
  771.                         dict.TreatElementsAsHard = true;
  772.                     }
  773.                     else
  774.                     {
  775.                         return null;
  776.                     }
  777.                 }
  778.             }
  779.             return dict;
  780.         }
  781.         public DBDictionary GetSubDict(ObjectId dictid, bool createsubdict, params string[] dictnames)
  782.         {
  783.             DBDictionary dict =
  784.                 (DBDictionary)m_Transaction.GetObject(
  785.                     dictid,
  786.                     OpenMode.ForRead,
  787.                     false);
  788.             return GetSubDict(dict, createsubdict, dictnames);
  789.         }
  790.         public bool SetXRecord(DBDictionary dict, string key, ResultBuffer rb)
  791.         {
  792.             Xrecord rec;
  793.             if (dict.Contains(key))
  794.             {
  795.                 rec =
  796.                     (Xrecord)m_Transaction.GetObject(
  797.                         dict.GetAt(key),
  798.                         OpenMode.ForWrite,
  799.                         false);
  800.             }
  801.             else
  802.             {
  803.                 dict.UpgradeOpen();
  804.                 rec = new Xrecord();
  805.                 dict.SetAt(key, rec);
  806.                 m_Transaction.AddNewlyCreatedDBObject(rec, true);
  807.             }
  808.             rec.Data = rb;
  809.             return true;
  810.         }
  811.         public bool SetXRecord(ResultBuffer rb, DBObject obj,  string key, params string[] dictnames)
  812.         {
  813.             ObjectId id = obj.ExtensionDictionary;
  814.             if (id == ObjectId.Null)
  815.             {
  816.                 obj.CreateExtensionDictionary();
  817.                 id = obj.ExtensionDictionary;
  818.             }
  819.             DBDictionary dict = GetSubDict(id, true, dictnames);
  820.             return SetXRecord(dict, key, rb);
  821.         }
  822.         public bool SetXRecord(ResultBuffer rb, string key, params string[] dictnames)
  823.         {
  824.             DBDictionary dict = GetSubDict(m_Database.NamedObjectsDictionaryId, true, dictnames);
  825.             return SetXRecord(dict, key, rb);
  826.         }
  827.         public ResultBuffer GetXRecord(DBDictionary dict, string key)
  828.         {
  829.             if (dict != null)
  830.             {
  831.                 if (dict.Contains(key))
  832.                 {
  833.                     Xrecord rec =
  834.                         (Xrecord)m_Transaction.GetObject(
  835.                             dict.GetAt(key),
  836.                             OpenMode.ForRead);
  837.                     return rec.Data;
  838.                 }
  839.             }
  840.             return null;
  841.         }
  842.         public ResultBuffer GetXRecord(DBObject obj, string key, params string[] dictnames)
  843.         {
  844.             ObjectId id = obj.ExtensionDictionary;
  845.             DBDictionary dict = GetSubDict(id, false, dictnames);
  846.             return GetXRecord(dict, key);
  847.         }
  848.         public ResultBuffer GetXRecord(string key, params string[] dictnames)
  849.         {
  850.             DBDictionary dict = GetSubDict(m_Database.NamedObjectsDictionaryId, false, dictnames);
  851.             return GetXRecord(dict, key);
  852.         }
  853.         #endregion
  854.     }
  855. }
 楼主| 发表于 2009-6-4 12:46:00 | 显示全部楼层
BlockRefJig.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.EditorInput;
  6. namespace TlsCad
  7. {
  8.     public class BlockRefJig : EntityJig
  9.     {
  10.         Point3d m_Position,m_BasePoint;
  11.         double m_Angle;
  12.         int m_PromptCounter;
  13.         Matrix3d m_Ucs;
  14.         Matrix3d m_Mat;
  15.         //键值对集合(属性定义/引用)
  16.         Dictionary<AttributeDefinition, AttributeReference> m_Attribs;
  17.         public BlockRefJig(BlockReference blkref, Dictionary<AttributeDefinition, AttributeReference> attribs)
  18.             : base(blkref)
  19.         {
  20.             m_Position = new Point3d();
  21.             m_Angle = 0;
  22.             m_Ucs = CadHelper.Editor.CurrentUserCoordinateSystem;
  23.             m_Attribs = attribs;
  24.             Update();
  25.         }
  26.         protected override SamplerStatus Sampler(JigPrompts prompts)
  27.         {
  28.             switch (m_PromptCounter)
  29.             {
  30.                 case 0:
  31.                     {
  32.                         JigPromptPointOptions jigOpts = new JigPromptPointOptions("\n请输入基点:");
  33.                         jigOpts.UserInputControls =
  34.                             UserInputControls.Accept3dCoordinates |
  35.                             UserInputControls.NoZeroResponseAccepted |
  36.                             UserInputControls.NoNegativeResponseAccepted;
  37.                         PromptPointResult res = prompts.AcquirePoint(jigOpts);
  38.                         Point3d pnt = res.Value;
  39.                         if (pnt != m_Position)
  40.                         {
  41.                             m_Position = pnt;
  42.                             m_BasePoint = m_Position;
  43.                         }
  44.                         else
  45.                             return SamplerStatus.NoChange;
  46.                         if (res.Status == PromptStatus.Cancel)
  47.                             return SamplerStatus.Cancel;
  48.                         else
  49.                             return SamplerStatus.OK;
  50.                     }
  51.                 case 1:
  52.                     {
  53.                         JigPromptAngleOptions jigOpts = new JigPromptAngleOptions("\n请输入旋转角度:");
  54.                         jigOpts.UserInputControls =
  55.                             UserInputControls.Accept3dCoordinates |
  56.                             UserInputControls.NoNegativeResponseAccepted |
  57.                             UserInputControls.GovernedByUCSDetect |
  58.                             UserInputControls.UseBasePointElevation;
  59.                         jigOpts.Cursor = CursorType.RubberBand;
  60.                         jigOpts.UseBasePoint = true;
  61.                         jigOpts.BasePoint = m_BasePoint;
  62.                         PromptDoubleResult res = prompts.AcquireAngle(jigOpts);
  63.                         double angleTemp = res.Value;
  64.                         if (angleTemp != m_Angle)
  65.                             m_Angle = angleTemp;
  66.                         else
  67.                             return SamplerStatus.NoChange;
  68.                         if (res.Status == PromptStatus.Cancel)
  69.                             return SamplerStatus.Cancel;
  70.                         else
  71.                             return SamplerStatus.OK;
  72.                     }
  73.                 default:
  74.                     return SamplerStatus.NoChange;
  75.             }
  76.         }
  77.         protected override bool Update()
  78.         {
  79.             try
  80.             {
  81.                 /*Ucs下Jig的流程:
  82.                  * 1.先将图元在Wcs下摆正,即//xy平面
  83.                  * 2.将获取点坐标转换到Ucs下
  84.                  * 3.将图元在Ucs下摆正
  85.                  * 4.矩阵变换到Wcs
  86.                  */
  87.                 BlockReference blkref = (BlockReference)Entity;
  88.                 blkref.Normal = Vector3d.ZAxis;
  89.                 blkref.Position = CadHelper.Wcs2Ucs(m_Position);
  90.                 blkref.Rotation = m_Angle;
  91.                 blkref.TransformBy(m_Ucs);
  92.                 //将属性引用按块引用的Ocs矩阵变换
  93.                 if (m_Attribs != null)
  94.                 {
  95.                     m_Mat = blkref.BlockTransform;
  96.                     foreach (KeyValuePair<AttributeDefinition, AttributeReference> att in m_Attribs)
  97.                     {
  98.                         AttributeReference attref = att.Value;
  99.                         string s = attref.TextString;
  100.                         attref.SetAttributeFromBlock(att.Key, m_Mat);
  101.                         attref.TextString = s;
  102.                     }
  103.                 }
  104.                
  105.             }
  106.             catch
  107.             {
  108.                 return false;
  109.             }
  110.             return true;
  111.         }
  112.         public void SetPromptCounter(int i)
  113.         {
  114.             if (i == 0 || i == 1)
  115.             {
  116.                 m_PromptCounter = i;
  117.             }
  118.         }
  119.     }
  120. }
发表于 2009-6-11 11:15:00 | 显示全部楼层
CadHelper 这个类是哪个?我怎么找不到?我用的是CAD2006
 楼主| 发表于 2009-6-11 11:31:00 | 显示全部楼层

自定义类,可以直接下这里的类库

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=75701

TlsBasal 会逐渐开源:)

不支持2006,2005/6的.NetApi是有很多Bug的,做.Net开发应使用2007以上版本

发表于 2009-11-2 09:14:00 | 显示全部楼层
function XML() {
    [native code]
}
发表于 2009-12-28 23:35:00 | 显示全部楼层
好东东。
发表于 2009-12-28 23:50:00 | 显示全部楼层

飞狐兄太好了。这程序我又要研究几个月了

发表于 2009-12-29 00:09:00 | 显示全部楼层
飞狐兄。我学C#不久。脑子还是编程。还是以面向过程。我总是把所有功能写成方法。全做成静态的。看了你的代码。我就不知怎么办。做成非静态的有什么好处。方便在那里。BlockRefJig.cs 这个文件。应该怎么用这个JIG。能给出一个代码来不?先谢谢了。
 楼主| 发表于 2009-12-29 08:44:00 | 显示全部楼层

BlockRefJig是为DBTransaction的InsertBlock函数服务的:),一楼有调用的代码

DBTransaction本身是为简化托管代码而实现,

经常看到就算一个实体加入数据库也要用单个的事务,效率很低,哈哈

所以就有写该类的想法

至于静态,非静态,我的理解:类是数据及相关操作的集合

发表于 2009-12-29 18:08:00 | 显示全部楼层

就是加一条直线。也要打开数据库。 另外我试 了。加1000条直线。用一次trans跟用1000次。差别感觉不出来。难道我的机子牛B。

飞狐兄的最后一句我上班要好好理解一下

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 02:51 , Processed in 0.221956 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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