找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1374|回复: 1

[分享] Copy From Groups

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-1 22:58:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 csharp 于 2014-5-1 23:01 编辑

  1. using System;
  2. using System.Globalization;
  3. using System.Runtime.InteropServices;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.Interop.Common;
  10. using AcadApp = Autodesk.AutoCAD.Interop.AcadApplication;
  11. using Autodesk.AutoCAD.Interop;

  12. namespace PartGroupsMonitor
  13. {
  14.     class CopyGroupFromExisting
  15.     {
  16.         public void CreateGroup()
  17.         {
  18.             Document document = Application.DocumentManager.MdiActiveDocument;
  19.             Editor editor = document.Editor;
  20.             Database database = Application.DocumentManager.MdiActiveDocument.Database;
  21.             Matrix3d MoveMat = new Matrix3d();
  22.             string NewNam = "";
  23.             

  24.             using (document.LockDocument())
  25.             {
  26.                 PromptEntityOptions options = new PromptEntityOptions("\nSelect part of Group: < pick > ");
  27.                 options.SetRejectMessage("\nMust be Group related. ");

  28.                 options.AddAllowedClass(typeof(Arc), false);
  29.                 options.AddAllowedClass(typeof(Line), false);
  30.                 options.AddAllowedClass(typeof(Circle), false);
  31.                 options.AddAllowedClass(typeof(Polyline), false);

  32.                 PaletteUtils.ActivateEditor();
  33.                 PromptEntityResult selection = editor.GetEntity(options);

  34.                 if (selection.Status == PromptStatus.OK)
  35.                 {
  36.                     Object MvePnt = GroupDisplacementPoint();

  37.                     if (MvePnt is Point3d)
  38.                     {
  39.                         Point3d p1 = (Point3d)MvePnt;

  40.                         using (Transaction trans = database.TransactionManager.StartTransaction())
  41.                         {
  42.                             Entity obj = (Entity)trans.GetObject(selection.ObjectId, OpenMode.ForRead);

  43.                             if (obj != null)
  44.                             {

  45.                                 Point3d basePt = obj.GeomExtents.MaxPoint;
  46.                                 MoveMat = Matrix3d.Displacement(p1.GetVectorTo(basePt));

  47.                                 ResultBuffer rbf = SafeNativeMethods.EntGet(obj.ObjectId);
  48.                                 TypedValue[] XdataOut = rbf.AsArray();

  49.                                 if (XdataOut[3].Value.ToString() == "{ACAD_REACTORS")
  50.                                 {                                   
  51.                                     
  52.                                     ObjectId reactorId = (ObjectId)XdataOut[4].Value;                              

  53.                                     DBDictionary GrpDic = (DBDictionary)trans.GetObject(database.GroupDictionaryId, OpenMode.ForWrite);

  54.                                     Group grp = (Group)trans.GetObject(reactorId, OpenMode.ForWrite);                                    
  55.                                     
  56.                                     string str = grp.Name;
  57.                                     NewNam = string.Concat(str.Substring(0, str.IndexOf("-", 0, str.Length) + 3), DateTime.Now.Millisecond.ToString());

  58.                                     Group NewGroup = new Group(NewNam, true);

  59.                                     NewGroup.Description = DateTime.Now.ToShortDateString();
  60.                                     
  61.                                     ObjectIdCollection IDCol = new ObjectIdCollection(grp.GetAllEntityIds());

  62.                                     IdMapping IDMap = new IdMapping();

  63.                                     IDMap = database.DeepCloneObjects(IDCol, database.CurrentSpaceId, false);
  64.                                     
  65.                                     foreach (IdPair pair in IDMap)
  66.                                     {
  67.                                         if (pair.IsPrimary)
  68.                                         {

  69.                                             Entity en = (Entity)trans.GetObject(pair.Value, OpenMode.ForRead);
  70.                                             
  71.                                             en.UpgradeOpen();                                            
  72.                                             en.TransformBy(MoveMat);
  73.                                             NewGroup.Append(en.ObjectId);
  74.                                             en.RecordGraphicsModified(true);
  75.                                             trans.TransactionManager.QueueForGraphicsFlush();
  76.                                             en.DowngradeOpen();                                            
  77.                                             
  78.                                         }
  79.                                     }                                    

  80.                                     GrpDic.SetAt(NewNam, NewGroup);

  81.                                     trans.AddNewlyCreatedDBObject(NewGroup, false);

  82.                                     NewGroup.DowngradeOpen();
  83.                                     AcadDocument ADoc = (AcadDocument)document.AcadDocument;
  84.                                     AcadObject AO = ADoc.Dictionaries.Item("ACAD_GROUP");
  85.                                     IAcadGroups iags = (IAcadGroups)AO;
  86.                                     iags.Add(NewNam);                                                                                                

  87.                                     trans.Commit();

  88.                                     editor.WriteMessage("\nGroup < " + str + " > selected. ");

  89.                                 }                                
  90.                             }
  91.                             else
  92.                             {
  93.                                 editor.WriteMessage("\nMust be Group related. ");
  94.                             }
  95.                         }
  96.                     }
  97.                     else
  98.                     {
  99.                         editor.WriteMessage("\n *Cancelled* ");
  100.                     }                    
  101.                 }
  102.                 else
  103.                 {                    
  104.                     editor.WriteMessage("\nNothing Picked: *" + selection.Status.ToString() + "*");
  105.                 }
  106.             }            
  107.             editor.WriteMessage("\n\nCommand:\n");            
  108.             database.Dispose();            
  109.         }
  110.         
  111.         public Object GroupDisplacementPoint()
  112.         {
  113.             Document document = Application.DocumentManager.MdiActiveDocument;
  114.             Editor editor = document.Editor;
  115.             PromptPointOptions options2 = new PromptPointOptions("\nPick location point: ");
  116.             options2.AllowNone = false;
  117.             PromptPointResult point = editor.GetPoint(options2);
  118.             
  119.             return point.Value;
  120.             
  121.         }        
  122.     }
  123. }

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-5-2 19:57:30 来自手机 | 显示全部楼层
标记一下
SafeNativeMethods.EntGet
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:52 , Processed in 0.371110 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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