明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: chpmould

[基础] 新建和插入块函数

  [复制链接]
 楼主| 发表于 2010-12-5 17:46:56 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-5 17:48 编辑

我还是没有测试成功,一直出错,请帮助看看是什么原因...

  1. public void CreateCircle()
  2. {
  3.    Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.    Editor ed = doc.Editor;
  5.    Database db = doc.Database;
  6.    using (doc.LockDocument())
  7.    using (Transaction tr = db.TransactionManager.StartTransaction())
  8.    {
  9.     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  10.     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  11.     Circle c1 = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 10);
  12.     Circle c2 = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 15);
  13.     DBObjectCollection objs = new DBObjectCollection();
  14.     objs.Add(c1);
  15.     objs.Add(c2);
  16.     CreateBlockDef("Test", objs);
  17.     btr.AppendEntity(c1);
  18.     btr.AppendEntity(c2);
  19.     tr.AddNewlyCreatedDBObject(c1, true);
  20.     tr.AddNewlyCreatedDBObject(c2, true);
  21.     tr.Commit();
  22.    }
  23. }
发表于 2010-12-5 18:00:00 | 显示全部楼层
看三楼
CreateBlockDef也改了下,忘掉事务提交了
 楼主| 发表于 2010-12-5 18:12:47 | 显示全部楼层
狐哥:
        我用上面我贴出来画画的代码来测试,还是没有测试成功,一直出错,请帮助测试看看是什么原因...
发表于 2010-12-5 18:25:47 | 显示全部楼层
我这里测试没问题的
 楼主| 发表于 2010-12-5 19:23:19 | 显示全部楼层
是否与CAD版本有关啊,我用的是CAD2008+VS2008
发表于 2010-12-5 19:41:18 | 显示全部楼层
我也是
建议,你还是把手册再仔细看一遍吧,你自己说看了n遍,但看了n遍应该是不会代码写成这样的,汗
C#的语法还是要多熟悉
你犯的都是常识性错误
 楼主| 发表于 2010-12-5 20:19:35 | 显示全部楼层
我在去试试。。。
发表于 2010-12-6 20:53:40 | 显示全部楼层
重写了一遍,CreateXXX其实感觉没必要的,
简单的东西没必要搞一大堆函数。
其次,建议的方式是一个事务到底,否则会出问题的
  1.         [CommandMethod("tt4")]
  2.         public void test24()
  3.         {

  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;

  7.             string blkname = "Test";

  8.             using (Transaction tr = db.TransactionManager.StartTransaction())
  9.             {

  10.                 Circle c1 = new Circle(Point3d.Origin, Vector3d.ZAxis, 10);
  11.                 Circle c2 = new Circle(Point3d.Origin, Vector3d.ZAxis, 15);

  12.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  13.                 ObjectId blkdefid = GetRecorId(tr, bt, blkname);

  14.                 if (blkdefid == ObjectId.Null)
  15.                 {
  16.                     BlockTableRecord blkdef = new BlockTableRecord { Name = blkname };
  17.                     bt.UpgradeOpen();
  18.                     blkdefid = bt.Add(blkdef);
  19.                     tr.AddNewlyCreatedDBObject(blkdef, true);
  20.                     bt.DowngradeOpen();

  21.                     AddEntity(tr, blkdef, c1);
  22.                     AddEntity(tr, blkdef, c2);
  23.                 }

  24.                 BlockReference bref = new BlockReference(Point3d.Origin, blkdefid);
  25.                 BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  26.                 AddEntity(tr, btr, bref);

  27.                 tr.Commit();

  28.             }


  29.         }

  30.         /// <summary>
  31.         /// 在符号表中获取对应键值的记录Id
  32.         /// </summary>
  33.         /// <param name="table">符号表</param>
  34.         /// <param name="key">记录键值</param>
  35.         /// <returns>对应键值的记录Id</returns>
  36.         public static ObjectId GetRecorId<T>(Transaction tr, T table, string key) where T : SymbolTable
  37.         {

  38.             if (table.Has(key))
  39.             {
  40.                 if (Application.Version.Major < 18)
  41.                 {
  42.                     ObjectId idres = table[key];
  43.                     if (!idres.IsErased)
  44.                         return idres;

  45.                     foreach (ObjectId id in table)
  46.                     {
  47.                         if (!id.IsErased)
  48.                         {
  49.                             SymbolTableRecord str = id.GetObject<SymbolTableRecord>(tr);
  50.                             if (str.Name == key)
  51.                                 return str.ObjectId;
  52.                         }
  53.                     }
  54.                 }
  55.                 else
  56.                 {
  57.                     return table[key];
  58.                 }
  59.             }
  60.             return ObjectId.Null;
  61.         }


  62.         public ObjectId AddEntity(Transaction tr, BlockTableRecord btr, Entity ent)
  63.         {
  64.             ObjectId id = btr.AppendEntity(ent);
  65.             tr.AddNewlyCreatedDBObject(ent, true);
  66.             return id;
  67.         }
 楼主| 发表于 2010-12-6 21:19:47 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-6 21:20 编辑

谢谢狐,你昨天帮我写的那块函数,我昨天已调试通过了,今天你重新写的这个我现是越看越糊涂啦...其实我只是想学习一下如自定义一些通用函数...
发表于 2013-4-10 19:50:39 | 显示全部楼层
本帖最后由 介之推 于 2013-4-10 19:51 编辑
雪山飞狐_lzh 发表于 2010-12-6 20:53
重写了一遍,CreateXXX其实感觉没必要的,
简单的东西没必要搞一大堆函数。
其次,建议的方式是一个事务到 ...


你好啊,版主,我调试你第18楼的代码时出错了啊,在GetObjectId函数中的这一行代码:
  1. SymbolTableRecord str = id.GetObject<SymbolTableRecord>(tr);
复制代码
VS提示说:
非泛型 方法“Autodesk.AutoCAD.DatabaseServices.ObjectId.GetObject(Autodesk.AutoCAD.DatabaseServices.OpenMode, bool, bool)”不能与类型实参一起使用
这是怎么回事啊?
我现在也想插入块,和楼主要实现的目的一致啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:26 , Processed in 0.164822 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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