明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4250|回复: 19

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

  [复制链接]
发表于 2010-12-4 18:26 | 显示全部楼层 |阅读模式
本帖最后由 chpmould 于 2010-12-4 20:41 编辑

请教老师:
例如:首先判断当前图档中是否有一图块“A”,如果没有则新建,如果有则直接插入。
 楼主| 发表于 2010-12-4 18:28 | 显示全部楼层
下面是我写的一部分,但是有问题,请帮助修正一下...
  1.       public static ObjectId CreateBlock(string blockname, ObjectIdCollection[] objIds)
  2.         {
  3.             DocumentLock doclock = Application.DocumentManager.MdiActiveDocument.LockDocument();
  4.             ObjectId blockid = new ObjectId();
  5.             Database db = HostApplicationServices.WorkingDatabase;
  6.             using (Transaction tr = db.TransactionManager.StartTransaction())
  7.             {
  8.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite, false);
  9.                 BlockTableRecord btr = new BlockTableRecord();
  10.                 btr.Name = blockname;
  11.                 if (!bt.Has(blockname)) //判断是否存在名为blockname的块,如果没有则新建
  12.                 {
  13.                     for (int i = 0; i <= objIds.Length; i++)
  14.                     {
  15.                         btr.AppendEntity(btr);
  16.                     }
  17.                     blockid = bt.Add(btr);
  18.                     tr.AddNewlyCreatedDBObject(btr, true);
  19.                     tr.Commit();
  20.                 }
  21.                 else //如果当前图面内存中有此块,则插入此块
  22.                 {
  23.                     BlockTableRecord block = (BlockTableRecord)trans.GetObject(bt[blockName], OpenMode.ForRead);
  24.                     BlockReference blockRef = new BlockReference(point, bt[blockName]);
  25.                     blockRef.ScaleFactors = scale;
  26.                     blockRef.Rotation = rotateAngle;
  27.                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  28.                     btr.AppendEntity(blockRef);
  29.                     trans.AddNewlyCreatedDBObject(blockRef, true);
  30.                     trans.Commit();
  31.                 }
  32.             }
  33.             doclock.Dispose();
  34.             return blockid;
  35.         }
发表于 2010-12-4 21:37 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-5 17:58 编辑

你的代码,哎,惨不忍睹


  1.         public static ObjectId CreateBlockDef(string blockname, DBObjectCollection objs)
  2.         {
  3.             Database db = HostApplicationServices.WorkingDatabase;
  4.             using (Transaction tr = db.TransactionManager.StartTransaction())
  5.             {
  6.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite, false);
  7.                 if (bt.Has(blockname))
  8.                 {
  9.                     return bt[blockname];
  10.                 }
  11.                 else
  12.                 {
  13.                     BlockTableRecord btr = new BlockTableRecord();
  14.                     btr.Name = blockname;
  15.                     ObjectId id = bt.Add(btr);
  16.                     tr.AddNewlyCreatedDBObject(btr, true);
  17.                     foreach (Entity ent in objs)
  18.                     {
  19.                         btr.AppendEntity(ent);
  20.                         tr.AddNewlyCreatedDBObject(ent, true);
  21.                     }
  22.                     tr.Commit();
  23.                     return id;
  24.                 }
  25.             }
  26.         }

  27.         public static ObjectId CreateBlockRef(string blockname, Point3d position, double rotateAngle, double scale)
  28.         {
  29.             Database db = HostApplicationServices.WorkingDatabase;
  30.             using (Transaction tr = db.TransactionManager.StartTransaction())
  31.             {

  32.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead, false);
  33.                 BlockReference blockRef = new BlockReference(position, bt[blockname]);
  34.                 blockRef.ScaleFactors = new Scale3d(scale, scale, scale);
  35.                 blockRef.Rotation = rotateAngle;

  36.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  37.                 ObjectId id = btr.AppendEntity(blockRef);
  38.                 tr.AddNewlyCreatedDBObject(blockRef, true);
  39.                 tr.Commit();
  40.                 return id;
  41.             }
  42.         }

  43.         [CommandMethod("t8")]
  44.         public static void Test8()
  45.         {
  46.             Circle c1 = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 10);
  47.             Circle c2 = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 15);
  48.             DBObjectCollection objs = new DBObjectCollection();
  49.             objs.Add(c1);
  50.             objs.Add(c2);
  51.             CreateBlockDef("Test", objs);
  52.             CreateBlockRef("Test", Point3d.Origin, 0, 1);
  53.         }
发表于 2010-12-4 22:01 | 显示全部楼层
本想只是打击你一下,不想斑竹也在这里浪费时间,但看到后面我后悔了,文字已经写了一些,还是贴出来吧。
你向别人请教,至少你的代码通过编译吧。
我的文字只是挑毛病,并不有助于完成函数,得罪了!
    public static ObjectId CreateBlock(string blockname, ObjectIdCollection[] objIds)
    {

      DocumentLock doclock = Application.DocumentManager.MdiActiveDocument.LockDocument();
      //因你这个函数里对AutoCAD数据库操作并不是处于一种外部环境(简单说不是在对话框环境),所以你这里没有必要锁定。你非得要锁定也行,但既然你锁定了,后面应该进行异常捕捉,以确保在后面解锁
      ObjectId blockid = new ObjectId();
      //首先ObjectId没有无参数的构造函数,这里使用new也没有任何意义, 建议ObjectId blockid =ObjectId.Null

      Database db = HostApplicationServices.WorkingDatabase;

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

        BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite, false);

        BlockTableRecord btr = new BlockTableRecord();

        btr.Name = blockname;

        if (!bt.Has(blockname))
        {//你为什么要加一个逻辑非!呢?你把后面的代码块互换一下不就少麻烦一下CPU吗?

          for (int i = 0; i <= objIds.Length; i++)
          {

            btr.AppendEntity(btr);
           //这里什么意思?自己添加自己
          }

          blockid = bt.Add(btr);

          tr.AddNewlyCreatedDBObject(btr, true);

          tr.Commit();

        }

        else
        {
          //这里的代码不是你写的吧,point scale rotateAngle trans 这些变量孙悟空帮你变出来?
          BlockTableRecord block = (BlockTableRecord)trans.GetObject(bt[blockName], OpenMode.ForRead);

          BlockReference blockRef = new BlockReference(point, bt[blockName]);

          blockRef.ScaleFactors = scale;

          blockRef.Rotation = rotateAngle;

          BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
          //知不知道btr你在前面声明过了
          btr.AppendEntity(blockRef);

          trans.AddNewlyCreatedDBObject(blockRef, true);
         
          trans.Commit();

        }

      }

      doclock.Dispose();

      return blockid;

    }

评分

参与人数 1明经币 +1 收起 理由
雪山飞狐_lzh + 1 我很赞同

查看全部评分

 楼主| 发表于 2010-12-5 08:21 | 显示全部楼层
非常感谢谢谢各位老师的耐心指导!!! 以上代码是我参照一些例子写的,有很多地方还没有理解,所以问题一大堆...
 楼主| 发表于 2010-12-5 13:47 | 显示全部楼层
我调用新建块函数没有任何反应,我是按以下方式调用,请问我是那里出错了?(但是调用那插入块测试成功)
  1. ObjectIdCollection Blk01 = new ObjectIdCollection();
  2. Blk01.Add(Cir01);
  3. Blk01.Add(Cir02);
  4. // 定义一个集合数组
  5. ObjectIdCollection[] blks = new ObjectIdCollection[1];
  6. blks.SetValue(Blk01, 0);
  7. ObjectId BlkId1 = CreateBlockDef("Test", blks);
复制代码
发表于 2010-12-5 13:59 | 显示全部楼层
没修改你的代码的声明就直接改了,楼上的代码已更正
 楼主| 发表于 2010-12-5 15:36 | 显示全部楼层
我还是没有测试成功,例如: 我是按以下方式画出两个圆,下面如何调用CreateBlockDef函数
  1. public void test()
  2. {
  3.    ObjectId cir01 = AddCircle(new Point3d(0, 0, 0),10); //第一个圆
  4.    ObjectId cir02 = AddCircle(new Point3d(0, 0, 0),15); //第二个圆
  5.    //
  6.      这里如何调用CreateBlockDef新建块
  7.    //
  8. }
复制代码
发表于 2010-12-5 16:32 | 显示全部楼层
Circle c1 = new Circle(new Point3d(0, 0, 0),10);
Circle c2 = new Circle(new Point3d(0, 0, 0),10);
DBObjectCollection objs = new DBObjectCollection();
objs.Add(c1);
objs.Add(c2);
CreateBlockDef("Test", objs);
 楼主| 发表于 2010-12-5 16:44 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-5 17:50 编辑

如果是用ObjectId  Circle c1 = new Circle(new Point3d(0, 0, 0),10);可以吗?
下面我将我的测试代码贴上了你看看。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 13:06 , Processed in 0.260265 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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