找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1270|回复: 1

[每日一码] Jig动态变换图元

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-5-24 08:25:01 | 显示全部楼层 |阅读模式

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

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

×
  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using System.Collections.Generic;

  8. namespace Fsxm.Acad
  9. {
  10.     //Jig动态变换图元
  11.     public class Fsxm : DrawJig
  12.     {
  13.         Database db = HostApplicationServices.WorkingDatabase;
  14.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  15.         SelectionSet ss;
  16.         BlockReference insert;
  17.         Point3d minpt, oldpt;
  18.         double width, higth;
  19.         [CommandMethod("Trans", CommandFlags.UsePickSet)]
  20.         public void Trans()
  21.         {
  22.             BlockTable bt;
  23.             PromptSelectionOptions sop = new PromptSelectionOptions();
  24.             sop.MessageForAdding = "选择你要变换的东东";
  25.             sop.RejectObjectsOnLockedLayers = true;
  26.             PromptSelectionResult srt = ed.GetSelection(sop);
  27.             if (srt.Status != PromptStatus.OK) return;
  28.             ss = srt.Value;
  29.             using (Transaction trans = db.TransactionManager.StartTransaction())
  30.             {
  31.                 //做块
  32.                 BlockTableRecord btr;
  33.                 btr = new BlockTableRecord();
  34.                 btr.Name = "*U";
  35.                 //btr.Origin = prt.Value;
  36.                 bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
  37.                 bt.Add(btr);
  38.                 trans.AddNewlyCreatedDBObject(btr, true);
  39.                 //块中图元
  40.                 foreach (SelectedObject sobj in ss)
  41.                 {
  42.                     Entity ent = (Entity)trans.GetObject(sobj.ObjectId, OpenMode.ForRead);
  43.                     Entity copy = (Entity)ent.Clone();
  44.                     btr.AppendEntity(copy);
  45.                     trans.AddNewlyCreatedDBObject(copy, true);
  46.                     ent.Highlight();//高亮要托动的东东
  47.                 }
  48.                 //算出块大小
  49.                 insert = new BlockReference(new Point3d(), btr.Id);
  50.                 Extents3d box = insert.GeometricExtents;
  51.                 Vector3d v = box.MaxPoint.GetVectorTo(box.MinPoint);
  52.                 width = v.X;
  53.                 higth = v.Y;
  54.                 //改下块原点
  55.                 btr.Origin = minpt = box.MinPoint;
  56.                 insert.Position = minpt;
  57.                 //递交
  58.                 trans.Commit();
  59.             }
  60.             //开始托动
  61.             PromptResult var = ed.Drag(this);
  62.             if (var.Status != PromptStatus.OK)
  63.             {
  64.                 //去高亮
  65.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  66.                 {
  67.                     foreach (SelectedObject obj in ss)
  68.                     {
  69.                         Entity ent = (Entity)trans.GetObject(obj.ObjectId, OpenMode.ForWrite);
  70.                         ent.Unhighlight();
  71.                     }
  72.                 }
  73.                 return;
  74.             }
  75.             using (Transaction trans = db.TransactionManager.StartTransaction())
  76.             {
  77.                 //插入打散的块
  78.                 BlockTableRecord MSpace = (BlockTableRecord)trans.GetObject(bt["*Model_Space"], OpenMode.ForWrite);
  79.                 DBObjectCollection exs = new DBObjectCollection();
  80.                 insert.Explode(exs);
  81.                 foreach (DBObject obj in exs)
  82.                 {
  83.                     MSpace.AppendEntity((Entity)obj);
  84.                     trans.AddNewlyCreatedDBObject(obj, true);
  85.                 }
  86.                 //删除老线
  87.                 foreach (SelectedObject obj in ss)
  88.                 {
  89.                     Entity ent = (Entity)trans.GetObject(obj.ObjectId, OpenMode.ForWrite);
  90.                     ent.Erase();
  91.                 }
  92.                 //递交
  93.                 trans.Commit();
  94.             }
  95.         }
  96.         protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  97.         {
  98.             draw.Geometry.Draw(insert);
  99.             return true;
  100.         }
  101.         protected override SamplerStatus Sampler(JigPrompts prompts)
  102.         {
  103.             Point3d cur = prompts.AcquirePoint("拾取变形目标点").Value;
  104.             if (oldpt == cur)
  105.                 return SamplerStatus.NoChange;
  106.             oldpt = cur;
  107.             Vector3d v = cur.GetVectorTo(minpt);
  108.             double scX = v.X / width;
  109.             double scY = v.Y / higth;
  110.             insert.ScaleFactors = new Scale3d(scX, scY, 1);
  111.             return SamplerStatus.OK;
  112.         }
  113.     }
  114. }


20081031_430c80a096076f5797b3s81czhHfDMaE.gif

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

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-5-24 09:38:03 | 显示全部楼层
这个挺好的.不会这种语言,能帮忙编译个2007用的不,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-2-29 00:24 , Processed in 0.362481 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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