明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6525|回复: 5

[图元] 用C#实现关联填充

[复制链接]
发表于 2009-5-16 17:44:00 | 显示全部楼层 |阅读模式
要用ARX实现关联的图案填充,必须使用“永久反应器”这一技术,而C#只有“事件”(相当于ARX中的“临时反应器”),尽管填充对象(Hatch类)有一个Associative属性,但简单地设置为true,并不能解决问题。我一直觉得要用C#实现关联的图案填充必须要借助ARX的帮助,后来发现,用纯C#还是可以实现关联填充的……
  1. using System;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5. namespace AssociativeHatch
  6. {
  7.     public class Commands
  8.     {
  9.         [CommandMethod("nt")]
  10.         public void AssociativeHatch()
  11.         {
  12.             Database db = HostApplicationServices.WorkingDatabase;
  13.             // 创建填充边界对象.
  14.             Line lineEnt1 = new Line(new Point3d(0, 0, 0), new Point3d(1000, 0, 0));
  15.             Line lineEnt2 = new Line(new Point3d(1000, 0, 0), new Point3d(800, 600, 0));
  16.             Line lineEnt3 = new Line(new Point3d(800, 600, 0), new Point3d(0, 0, 0));
  17.             Circle circleEnt = new Circle(new Point3d(500, 200, 0), Vector3d.ZAxis, 100);
  18.             ObjectId loopId1 = AppendEntity(lineEnt1);
  19.             ObjectId loopId2 = AppendEntity(lineEnt2);
  20.             ObjectId loopId3 = AppendEntity(lineEnt3);
  21.             ObjectId loopId4 = AppendEntity(circleEnt);
  22.             // 将填充边界对象ID添加到两个ObjectId集合中.
  23.             ObjectIdCollection loops1 = new ObjectIdCollection();
  24.             loops1.Add(loopId1);
  25.             loops1.Add(loopId2);
  26.             loops1.Add(loopId3);
  27.             ObjectIdCollection loops2 = new ObjectIdCollection();
  28.             loops2.Add(loopId4);
  29.             // 将两个ObjectId集合添加到一个ObjectId集合数组中.
  30.             ObjectIdCollection[] loops = new ObjectIdCollection[2];
  31.             loops.SetValue(loops1, 0);
  32.             loops.SetValue(loops2, 1);
  33.             // 填充图案对象.
  34.             Hatch hatchEnt;
  35.             ObjectId hatEntId = AddHatch(out hatchEnt, 0, "ANGLE", Math.PI / 3, 10);
  36.             // 关联填充图案与边界.
  37.             using (Transaction tr = db.TransactionManager.StartTransaction())
  38.             {
  39.                 hatchEnt = (Hatch)tr.GetObject(hatEntId, OpenMode.ForWrite);
  40.                 hatchEnt.Associative = true;
  41.                 for (int i = 0; i < loops.Length; i++)
  42.                 {
  43.                     hatchEnt.AppendLoop(HatchLoopTypes.Default, loops[i]);
  44.                 }
  45.                 tr.Commit();
  46.             }
  47.         }
  48.         // 由图案填充类型、填充图案名称、
  49.         // 填充角度和填充比例创建图案填充的函数.
  50.         // partType:0为预定义图案;1为用户定义图案;2为自定义图案.
  51.         private ObjectId AddHatch(out Hatch hatchEnt, HatchPatternType patType,
  52.             String patName, Double patternAngle, Double patternScale)
  53.         {
  54.             Hatch ent = new Hatch();
  55.             ent.HatchObjectType = HatchObjectType.HatchObject;
  56.             Database db = HostApplicationServices.WorkingDatabase;
  57.             using (Transaction trans = db.TransactionManager.StartTransaction())
  58.             {
  59.                 BlockTable bt = (BlockTable)trans.GetObject
  60.                     (db.BlockTableId, OpenMode.ForRead);
  61.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  62.                     (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  63.                 ObjectId entId = btr.AppendEntity(ent);
  64.                 trans.AddNewlyCreatedDBObject(ent, true);
  65.                 ent.SetDatabaseDefaults();
  66.                 ent.PatternAngle = patternAngle;
  67.                 ent.PatternScale = patternScale;
  68.                 ent.SetHatchPattern(patType, patName);
  69.                 hatchEnt = ent;
  70.                 trans.Commit();
  71.                 return entId;
  72.             }
  73.         }
  74.         // 添加图元到数据库.
  75.         private ObjectId AppendEntity(Entity ent)
  76.         {
  77.             Database db = HostApplicationServices.WorkingDatabase;
  78.             ObjectId entId;
  79.             using (Transaction trans = db.TransactionManager.StartTransaction())
  80.             {
  81.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
  82.                     OpenMode.ForRead);
  83.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  84.                     (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  85.                 entId = btr.AppendEntity(ent);
  86.                 trans.AddNewlyCreatedDBObject(ent, true);
  87.                 trans.Commit();
  88.             }
  89.             return entId;
  90.         }
  91.     }
  92. }


本帖子中包含更多资源

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

x

评分

参与人数 1威望 +1 明经币 +5 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 5 + 20 + 5 + 5 【精华】好文章

查看全部评分

发表于 2009-5-16 17:53:00 | 显示全部楼层

ahlzl又回来了,这下有劲了:)

 楼主| 发表于 2009-5-16 17:59:00 | 显示全部楼层
图案填充需要设置比例、角度、边界、关联性等参数。值得注意的是,设置这些参数的“次序”非常关键,先后次序一动,就出问题了!
发表于 2009-5-16 19:04:00 | 显示全部楼层

同感,有的时候挺恨自动桌子,总觉得他们对二次开发的态度是“管生不管养”,

DotNet这一块例子从05版到现在没看到增加几个,很多东西都要自己不断的调试

发表于 2009-5-16 19:41:00 | 显示全部楼层
是啊,现在搞那么多种开发语言,但想实现某些功能时,却经常不能单用一种语言就可以搞掂。是“管生不管养”,有始无终。
发表于 2009-5-18 08:29:00 | 显示全部楼层
似乎这里有点变化!俺来增加人气!呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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