lzx838 发表于 2010-6-23 17:40:00

[转帖]AutoCAD2011的边界对象获取实例

本实例运行环境:Visual studio 2010 + AutoCAD 2011

运行前:


运行后:




using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;
namespace ClassLibrary4
{
    public class Class1
    {
      static int _index = 1;
      
      public void TraceBoundaryAndHatch()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            //以点选的方式来获取我们的边界
            PromptPointResult ppr = ed.GetPoint("\n请选择内部点: ");
            if (ppr.Status != PromptStatus.OK)
                return;

            //获取创建边界的对象集合
            DBObjectCollection objs = ed.TraceBoundary(ppr.Value, false);

            if (objs.Count > 0)
            {
                Transaction tr = doc.TransactionManager.StartTransaction();
                using (tr)
                {
                  //我们将对象添加到模型空间
                  BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
                  BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt, OpenMode.ForWrite);

                  //将每个边界对象添加到块记录中,其ObjectId集合到ids集合
                  ObjectIdCollection ids = new ObjectIdCollection();

                  foreach (DBObject obj in objs)
                  {
                        Entity ent = obj as Entity;
                        if (ent != null)
                        {
                            //设置边界对象的颜色为自动增加的色号
                            ent.ColorIndex = _index;

                            //我们的透明度设置为50%(= 127)阿尔法值截断(255 * (100-n)/100)
                            ent.Transparency = new Transparency(127);

                            //每个边界对象添加到块记录,其ID添加到集合
                            ids.Add(btr.AppendEntity(ent));
                            tr.AddNewlyCreatedDBObject(ent, true);
                        }
                  }
                  //创建一个填充对象
                  Hatch hat = new Hatch();

                  //以Solid方式填充,其填充的颜色为自动增加的色号
                  hat.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
                  hat.ColorIndex = _index++;

                  //我们的透明度设置为50%(= 127)阿尔法值截断(255 * (100-n)/100)
                  hat.Transparency = new Transparency(127);

                  //添加到块记录和事务
                  ObjectId hatId = btr.AppendEntity(hat);
                  tr.AddNewlyCreatedDBObject(hat, true);

                  hat.Associative = true;
                  hat.AppendLoop(HatchLoopTypes.Default, ids);
                  hat.EvaluateHatch(true);

                  //提交事务
                  tr.Commit();
                }
            }
      }
    }
}




lzx838 发表于 2010-6-23 17:49:00

<p>以下是“Visual studio 2010+AutoCAD2011” 的源码文件:</p>
<p></p>

雪山飞狐_lzh 发表于 2010-6-23 20:41:00

<p>Autodesk应该搞个可以在实体集合中按点生成边界的方法,</p>
<p>这个TraceBoundary不伦不类的,汗</p>
<p>响铃试过点不在当前可见区域的情况没?</p>

lzx838 发表于 2010-6-23 23:08:00

还没试过,明天试试看。

lzx838 发表于 2010-6-24 09:10:00

<p>刚试了下,不在可视视图(也就是说在不见的地方)的情况下,有两种:</p>
<p>1.不可视的图元只有一个时,获取的边界正常;</p>
<p>运行前:</p>
<p></p>
<p>&nbsp;</p>
<p>运行后:</p>
<p></p>
<p>&nbsp;</p>
<p>2.不可视的图元不止一个时,获取的边界就不正常了.</p>
<p>运行前:</p>
<p></p>
<p>&nbsp;</p>
<p>运行后:&nbsp;</p>
<p></p>
<p>&nbsp;</p>
<p>在全可视的情况下,可以达到我们想要的理想效果:</p>

adolph 发表于 2010-6-24 11:39:00

<p>我现在用的是autocad2010map的,<font face="Verdana">TraceBoundary</font>这个方法只有2011里有吧?不知道兄台能否发一个有<font face="Verdana">TraceBoundary</font>方法的dll?还有在autocad2010里引用该dll不晓得能否用<font face="Verdana">TraceBoundary方法,我来试试,谢谢,顶下</font></p>

single-yu 发表于 2010-8-1 16:37:00

老大们,这个要求CAD的最低版本是多少呀?

lzx838 发表于 2010-8-3 09:17:00

这个功能只能在AutoCAD2011才能使用.
页: [1]
查看完整版本: [转帖]AutoCAD2011的边界对象获取实例