明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2467|回复: 4

请教关于C#开发ACAD2010生成的属性块显示延迟的问题

[复制链接]
发表于 2012-6-23 16:07:19 | 显示全部楼层 |阅读模式
本帖最后由 James.W.H.Li 于 2012-6-23 16:12 编辑

首先祝大家端午节快乐!
我在用C#进行ACAD2010二次开发的时候,遇到一个奇怪的问题,因为是新手,所以折腾了很长时间,也没有搞明白,最后用C++写了一个类似功能的测试程序,倒是没有问题。
莫非是C#运行效率的问题?
不敢妄加猜测,所以发上来请各位大虾诊断一下。
下面请先看代码:首先生成一个带属性的块定义,然后插入块参照。

[CommandMethod("TD")]
public void DotestDrawLabel()
{
    //数据库对象
    Database db = HostApplicationServices.WorkingDatabase;
    /*
      * 创建件号块定义
      */
    ObjectId labelblkid = ObjectId.Null;
    using (Transaction trans = db.TransactionManager.StartTransaction())
    {
        BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
        BlockTableRecord btr_Label = null;
        if (bt.Has("CNPTDwgLabelBlock_test"))
        {
            btr_Label = trans.GetObject(bt["CNPTDwgLabelBlock_test"], OpenMode.ForWrite) as BlockTableRecord;
            btr_Label.Erase();
        }
        btr_Label = new BlockTableRecord();
        btr_Label.Name = "CNPTDwgLabelBlock_test";
        //引线1
        Line line1 = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0));
        //line1.Layer = "02";//所在图层
        btr_Label.AppendEntity(line1);               
        //标线
        Line line3 = new Line(new Point3d(100, 100, 0), new Point3d(115, 100, 0));
        //line3.Layer = "01";//所在图层
        btr_Label.AppendEntity(line3);
        //序号 属性
        AttributeDefinition label_xh = new AttributeDefinition();
        //label_xh.Layer = "02";
        label_xh.Constant = false;
        label_xh.Tag = "Label序号";
        label_xh.Prompt = "LabelXUHAO";
        label_xh.TextString = "6";
        label_xh.Position = new Point3d(105, 103, 0);
        label_xh.Height = Double.Parse("50") ;               
        btr_Label.AppendEntity(label_xh);

        labelblkid = bt.Add(btr_Label);
        trans.AddNewlyCreatedDBObject(btr_Label, true);
        trans.Commit();
    }//end using
    /*
      * 创建件号块参照
      */
    using (Transaction trans = db.TransactionManager.StartTransaction())
    {
         BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
         BlockTableRecord mbtr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
         BlockTableRecord btr = trans.GetObject(labelblkid, OpenMode.ForRead) as BlockTableRecord;
         // 通过块定义添加块参照
         BlockReference br = new BlockReference(new Point3d(0, 0, 0), labelblkid);
         //把块参照添加到块表记录
         Object blkrefid = mbtr.AppendEntity(br);
         AttributeDefinition ad = null;
         AttributeReference ar = null;
         foreach (ObjectId id in btr)
         {
              if (id.ObjectClass.Equals(RXClass.GetClass(typeof(AttributeDefinition))))
              {                        
                   ad = trans.GetObject(id, OpenMode.ForRead) as AttributeDefinition;                        
                   ar = new AttributeReference();
                   ar.SetAttributeFromBlock(ad, br.BlockTransform);
                   //设置快参照中个属性的值
                   ar.Height = ad.Height;
                   ar.TextString = ad.TextString;
                   ar.WidthFactor = ad.WidthFactor;
                   ar.Position = ad.Position;
                   br.AttributeCollection.AppendAttribute(ar);
                }
            }
            // 通过事务添加块参照到数据库
            trans.AddNewlyCreatedDBObject(br, true);
            trans.Commit();
       }//end using
}
   
运行效果:块中的线条在执行命令后,立即显示,而属性确没有立即显示,而是等一会儿!
测试了很多次,会发现等的时间长短不一定,再就是还有一种情况,执行完命令后鼠标不动不显示,鼠标动一下立即显示?
……晕啊……
请各位大虾指点迷津,谢谢啦!!!

 楼主| 发表于 2012-6-23 16:20:47 | 显示全部楼层
大家别只看不说话啊,哪怕给点可以一试的方法也行撒。
发表于 2012-6-23 16:29:42 | 显示全部楼层
我先说说吧,不知道行不行。先说说我碰到的问题。就是我在以前做过修改图层线型的函数,可是没反应,搞不懂,后来想过是不是AutoCAD没有自动更新,于是强制刷新,你可以在Transaction.Commit()方法之后调用Editor.Regen()方法,尝试一下?
发表于 2012-6-23 21:33:25 | 显示全部楼层
br.AttributeCollection.AppendAttribute(ar);
后面加
trans.AddNewlyCreatedDBObject(ar, true);
属性没加入数据库的缘故
 楼主| 发表于 2012-6-24 11:33:52 | 显示全部楼层
雪山飞狐_lzh 发表于 2012-6-23 21:33
br.AttributeCollection.AppendAttribute(ar);
后面加
trans.AddNewlyCreatedDBObject(ar, true);

谢谢版主,问题顺利解决!

同时也谢谢cdinten!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 18:53 , Processed in 0.155802 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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