明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2041|回复: 7

用ActiveX方法在AutoCAD外操作块,请大家多帮助啊

[复制链接]
发表于 2007-2-8 10:35:00 | 显示全部楼层 |阅读模式

我使用的是C#的ActiveX方法操作AutoCAD的,同样的遍历实体方法,在AutoCAD之外与载入AutoCAD中有着天壤之别,当图元数多的时候非常慢。我的代码如下:

 foreach (dbx.AcadEntity acadBF in doc.ModelSpace)
    {
     if (acadBF.EntityName == "AcDbBlockReference")
     {
      dbx.AcadBlockReference blkRef = (dbx.AcadBlockReference)acadBF;
      if (blkRef.Name.ToUpper() == "BTL")
      {
       object[] atts = (object[])blkRef.GetAttributes();
       //这锟梢匀〉锰崾咀侄?lt;/p>

       for (int i = 0; i < atts.Length; i++)
       {
        dbx.AcadAttributeReference realattr = (dbx.AcadAttributeReference)atts;
        if (realattr.TagString == attrstr)
        {
         realattr.TextString = valuestr;
         doc.Save();
         doc.Close(true,false);
         //app.Quit();
         MessageBox.Show("finish!");
         return;
        }
       }
      }
     }
    }

我这样做是为了自动根据参数向一个图文件中填写块属性的,所以速度不能太慢。我现在正想做一个ARX命令作为填写属性的方法,在我的程序中调用。不知高手们还有没有更好的建议,比如能快速的找到图纸中的指定块(AcadBlockReference对象)。谢谢!


发表于 2007-2-8 11:06:00 | 显示全部楼层
我想可以先用块名称得到一个选择集,这样就缩小了遍历的范围,再用for循环查找。
 楼主| 发表于 2007-2-8 11:55:00 | 显示全部楼层
dfgs明示啊 写两句代码示范一下:)
发表于 2007-2-8 16:51:00 | 显示全部楼层
C语言忘记得太多了,VBA中是
dim ft(0 to 1) as integer
dim fd(0 to 1) as varriant
ft(0)=0
fd(0)="Insert"
ft(1)=2
fd(1)="块名"
s.select acselectionsetall,,,ft,fd


我的问题从来没人回答,真郁闷
发表于 2007-2-8 21:17:00 | 显示全部楼层

ObjectDBx里是没办法使用选择集的

 楼主| 发表于 2007-2-9 11:31:00 | 显示全部楼层

感谢朋友们的支持!根据你们的提示,我写了如下代码:

 short dtype = 100;
 IAcadSelectionSet sset = doc.SelectionSets.Add("ABC");
 sset.Select(dbx.AcSelect.acSelectionSetAll,null,null,dtype,"AcDbBlockReference");

我感觉我受不了了!总是提示Select方法的第4个参数FilterType类型不对,我就开始试了short、int、Int16、Int32、Int64都用上了,还是类型不对。疯了!我要改行!被这种问题捉弄真受不了!

评分

参与人数 1明经币 -1 收起 理由
mccad -1 【差评】 这是技术论坛,请不要贴无关的

查看全部评分

发表于 2007-2-10 17:58:00 | 显示全部楼层
FilterType类型:short[]
 楼主| 发表于 2007-2-10 23:05:00 | 显示全部楼层
  1.   /// <summary>
  2.   /// 填写对应文件的BTL块的指定属性的值
  3.   /// </summary>
  4.   public void ReplaceSign(String attrstr,String valuestr)
  5.   {
  6.    AutoCADConnector conn = new AutoCADConnector();
  7.    app = conn.Application;
  8.    IAcadDocument doc = app.Documents.Open(filepath,false,false);
  9.    
  10.    short[] filter = new short[2];
  11.    filter[0] = 100;
  12.    filter[1] = 2;
  13.    Object[] dvalue = new Object[2];
  14.    dvalue[0] = "AcDbBlockReference";
  15.    dvalue[1] = "BTL";
  16.    IAcadSelectionSet sset = doc.SelectionSets.Add("ABC");
  17.    sset.Select(AcSelect.acSelectionSetAll,null,null,filter,dvalue);
  18.    
  19.    for (int i = 0;i<sset.Count;i++)
  20.    {
  21.     AcadBlockReference blkRef = (AcadBlockReference)sset.Item(i);
  22.     object[] atts = (object[])blkRef.GetAttributes();
  23.     for (int j = 0; j < atts.Length; j++)
  24.     {
  25.      AcadAttributeReference realattr = (AcadAttributeReference)atts[j];
  26.      if (realattr.TagString == attrstr)
  27.      {
  28.       realattr.TextString = valuestr;
  29.       doc.Save();
  30.       doc.Close(true,false);
  31.       MessageBox.Show("finish!");
  32.       return;
  33.      }
  34.     }
  35.    }
  36.    doc.Close(false,false);
  37.   }
复制代码
感谢lzh741206的提示!感谢同志们的帮助!感谢明经!这是我的完整方法代码,速度很快,共享了!(我发的图片都很正规,可惜版主还是无情的CUT了...)

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

本版积分规则

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

GMT+8, 2024-11-26 18:52 , Processed in 0.149112 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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