明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2887|回复: 6

如何得到某块参照中的某子实体

[复制链接]
发表于 2010-7-23 08:43:00 | 显示全部楼层 |阅读模式
块参照视乎有一个函数叫GetSubEntity,不知道怎么用,或者哪位高手还能知道在已有的块参照中获取某个子实体,比如说,构成他的 某个圆,我想获取这个圆的一些属性,比如说坐标等
发表于 2010-7-23 09:33:00 | 显示全部楼层

这个在块定义里找

然后坐标转换到块参照

 楼主| 发表于 2010-7-23 12:19:00 | 显示全部楼层
给段example代码看看啥版主
 楼主| 发表于 2010-7-23 12:55:00 | 显示全部楼层
我用的vb.net
发表于 2010-7-23 13:53:00 | 显示全部楼层
VB.Net写不习惯了,自己转换一下吧
其实代码并不复杂
  1.         [CommandMethod("tt5")]
  2.         public static void test25()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             PromptEntityOptions opts = new PromptEntityOptions("\n请选择一个块:");
  7.             opts.SetRejectMessage("只能选择块参照");
  8.             opts.AddAllowedClass(typeof(BlockReference), false);
  9.             PromptEntityResult res = ed.GetEntity(opts);
  10.             if (res.Status != PromptStatus.OK)
  11.                 return;
  12.             Database db = doc.Database;
  13.             using (Transaction tr = db.TransactionManager.StartTransaction())
  14.             {
  15.                 BlockReference bref = tr.GetObject(res.ObjectId, OpenMode.ForRead) as BlockReference;
  16.                 BlockTableRecord btr = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  17.                 foreach (ObjectId id in btr)
  18.                 {
  19.                     Circle cir = tr.GetObject(id, OpenMode.ForRead) as Circle;
  20.                     if (cir != null)
  21.                     {
  22.                         Point3d pt = cir.Center.TransformBy(bref.BlockTransform);
  23.                         ed.DrawPoint(pt.Convert2d(new Plane()), 1, 1, 8);
  24.                     }
  25.                 }
  26.             }
  27.         }

扩展函数DrawPoint
  1.         public static void DrawVectors(this Editor editor, IEnumerable<Point2d> pnts, short colorIndex)
  2.         {
  3.             var itor = pnts.GetEnumerator();
  4.             if (!itor.MoveNext())
  5.                 return;
  6.             TypedValue tvFirst = new TypedValue((int)LispDataType.Point2d, itor.Current);
  7.             ResultBuffer rb =
  8.                 new ResultBuffer
  9.                 {
  10.                     new TypedValue((int)LispDataType.Int16, colorIndex),
  11.                     tvFirst,
  12.                 };
  13.             while (itor.MoveNext())
  14.             {
  15.                 var tv = new TypedValue((int)LispDataType.Point2d, itor.Current);
  16.                 rb.Add(tv);
  17.                 rb.Add(tv);
  18.             }
  19.             rb.Add(tvFirst);
  20.             editor.DrawVectors(rb, Matrix3d.Identity);
  21.         }
  22.         public static void DrawPoint(this Editor editor, Point2d pnt, short colorIndex, double radius, int numEdges)
  23.         {
  24.             Vector2d vec = Vector2d.XAxis * radius;
  25.             double angle = Math.PI * 2 / numEdges;
  26.             List<Point2d> pnts = new List<Point2d>();
  27.             for (int i = 0; i < numEdges; i++)
  28.             {
  29.                 pnts.Add(pnt + vec.RotateBy(angle * i));
  30.             }
  31.             editor.DrawVectors(pnts, colorIndex);
  32.         }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2010-7-23 14:33:00 | 显示全部楼层
nice ,very good,thanks
发表于 2012-3-28 00:06:03 | 显示全部楼层
雪山飞狐_lzh 发表于 2010-7-23 13:53
VB.Net写不习惯了,自己转换一下吧
其实代码并不复杂

请问Point3d pt = cir.Center.TransformBy(bref.BlockTransform);这句中的bref.BlockTransform在vb中怎么得到?ActiveX帮助中块参照里没有类似的属性,这个值该怎么得到?望指教 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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