找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2295|回复: 17

[每日一码] 使用JIG旋转属性块时属性文字实体保持水平不变

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-9-10 22:07:26 | 显示全部楼层 |阅读模式

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

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

×
今天看到NEWER版主写了个XDDRX API的 JIG旋转属性快文字保持不变的帖子,我这有个C#的代码,贴出来和大家分享。

游客,如果您要查看本帖隐藏内容请回复


  1. public class BRotateJig : DrawJig
  2. {
  3.     public Point3d _insPoint;
  4.     public double _brefAngle = 0.0;
  5.     private ObjectId _brefId = ObjectId.Null;
  6.     private ObjectId _btrId = ObjectId.Null;
  7.     private Extents3d _attExts = new Extents3d();
  8.     private Dictionary<String, Vector3d> _attDisps;
  9.     public Dictionary<String, Point3d> _attPos;

  10.     public BRotateJig(ObjectId brefId)
  11.     {
  12.         // Id of the block reference that we will jig
  13.         _brefId = brefId;

  14.         Database db = HostApplicationServices.WorkingDatabase;
  15.         using (Transaction tr = db.TransactionManager.StartTransaction())
  16.         {
  17.             BlockReference bref = tr.GetObject(
  18.                 brefId, OpenMode.ForWrite) as BlockReference;

  19.             _btrId = bref.BlockTableRecord;
  20.             _insPoint = bref.Position;
  21.             _brefAngle = bref.Rotation;

  22.             // We want to determine the extents of the
  23.             // attributes without considering the rotation
  24.             // that the block reference might already have.
  25.             bref.Rotation = 0.0;

  26.             // Determines the overall extents of the attribute
  27.             // references in the block
  28.             BlockTableRecord btr = tr.GetObject(
  29.                 _btrId, OpenMode.ForRead) as BlockTableRecord;
  30.             foreach (ObjectId id in btr)
  31.             {
  32.                 DBObject obj = id.GetObject(OpenMode.ForRead);
  33.                 AttributeDefinition attDef
  34.                                 = obj as AttributeDefinition;

  35.                 if ((attDef != null) && (!attDef.Constant))
  36.                 {
  37.                     using (AttributeReference attRef
  38.                                     = new AttributeReference())
  39.                     {
  40.                         attRef.SetAttributeFromBlock(
  41.                                 attDef, bref.BlockTransform);

  42.                         Extents3d exts = attRef.GeometricExtents;
  43.                         _attExts.AddExtents(exts);
  44.                     }
  45.                 }
  46.             }

  47.             // Stores the displacement of each attribute
  48.             //reference with mid point as the reference
  49.             // This is needed to keep the attribute references
  50.             // straight after the block reference is rotated.
  51.             Point3d midPt = _attExts.MinPoint +
  52.                 (_attExts.MaxPoint - _attExts.MinPoint) * 0.5;

  53.             _attDisps = new Dictionary<string, Vector3d>();
  54.             foreach (ObjectId id in btr)
  55.             {
  56.                 DBObject obj = id.GetObject(OpenMode.ForRead);
  57.                 AttributeDefinition attDef
  58.                                 = obj as AttributeDefinition;

  59.                 if ((attDef != null) && (!attDef.Constant))
  60.                 {
  61.                     using (AttributeReference attRef
  62.                                     = new AttributeReference())
  63.                     {
  64.                         attRef.SetAttributeFromBlock(
  65.                                  attDef, bref.BlockTransform);

  66.                         _attDisps.Add(attRef.Tag,
  67.                                      attRef.Position - midPt);
  68.                     }
  69.                 }
  70.             }

  71.             // Stores the positions of the attributes in the
  72.             // rotated state.
  73.             _attPos = new Dictionary<string, Point3d>();


  74.             // The block reference rotation was set to 0.0
  75.             // for calculating extents.
  76.             // We do not want to save that change
  77.             //tr.Commit();
  78.         }
  79.     }

  80.     public bool DoIt()
  81.     {
  82.         Editor ed
  83.         = Application.DocumentManager.MdiActiveDocument.Editor;

  84.         PromptResult jigRes = null;
  85.         jigRes = null;
  86.         jigRes = ed.Drag(this);
  87.         if (jigRes.Status != PromptStatus.OK)
  88.             return false;
  89.         return true;
  90.     }

  91.     protected override SamplerStatus Sampler(JigPrompts prompts)
  92.     {
  93.         JigPromptAngleOptions jigOpts = new JigPromptAngleOptions();
  94.         jigOpts.UserInputControls =
  95.                 (UserInputControls.Accept3dCoordinates |
  96.                  UserInputControls.NullResponseAccepted);

  97.         jigOpts.Message = "Specify rotation :";
  98.         jigOpts.BasePoint = _insPoint;
  99.         jigOpts.UseBasePoint = true;
  100.         jigOpts.Cursor = CursorType.RubberBand;
  101.         PromptDoubleResult jigRes = prompts.AcquireAngle(jigOpts);

  102.         double angle = jigRes.Value;

  103.         if (_brefAngle == angle)
  104.             return SamplerStatus.NoChange;

  105.         _brefAngle = angle;

  106.         if (jigRes.Status == PromptStatus.OK)
  107.             return SamplerStatus.OK;

  108.         return SamplerStatus.Cancel;
  109.     }

  110.     protected override bool WorldDraw(
  111.             Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  112.     {
  113.         using (BlockReference bref
  114.                        = new BlockReference(_insPoint, _btrId))
  115.         {
  116.             Database db = HostApplicationServices.WorkingDatabase;
  117.             using (Transaction tr
  118.                     = db.TransactionManager.StartTransaction())
  119.             {
  120.                 BlockTableRecord btr = tr.GetObject(
  121.                 _btrId, OpenMode.ForRead) as BlockTableRecord;

  122.                 foreach (ObjectId id in btr)
  123.                 {
  124.                     DBObject obj = id.GetObject(OpenMode.ForRead);
  125.                     AttributeDefinition attDef
  126.                                   = obj as AttributeDefinition;
  127.                     if ((attDef != null) && (!attDef.Constant))
  128.                     {
  129.                         using (AttributeReference attRef
  130.                                     = new AttributeReference())
  131.                         {
  132.                             attRef.SetAttributeFromBlock
  133.                                  (attDef, bref.BlockTransform);

  134.                             Point3d midPt = _attExts.MinPoint
  135.                             + (_attExts.MaxPoint-_attExts.MinPoint)
  136.                                                         * 0.5;

  137.                             Vector3d dir = midPt - bref.Position;

  138.                             dir = dir.RotateBy(
  139.                                    _brefAngle, Vector3d.ZAxis);

  140.                             midPt = bref.Position.TransformBy
  141.                                  (Matrix3d.Displacement(dir));

  142.                             if (_attDisps.ContainsKey(attRef.Tag))
  143.                             {
  144.                                 Point3d attPos =
  145.                                 midPt.TransformBy(
  146.                                 Matrix3d.Displacement(
  147.                                        _attDisps[attRef.Tag]));

  148.                                 attRef.Position = attPos;

  149.                                 if (_attPos.ContainsKey(attRef.Tag))
  150.                                     _attPos[attRef.Tag] = attPos;
  151.                                 else
  152.                                     _attPos.Add(attRef.Tag, attPos);

  153.                                 draw.Geometry.Draw(attRef);
  154.                             }
  155.                         }
  156.                     }
  157.                 }
  158.                 tr.Commit();
  159.             }

  160.             bref.Rotation = _brefAngle;
  161.             draw.Geometry.Draw(bref);
  162.         }
  163.         return true;
  164.     }
  165. }

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

已领礼包: 1个

财富等级: 恭喜发财

发表于 2016-10-3 18:42:22 | 显示全部楼层
正在写一个粗糙度标注程序练手,需要改变文字角度,研究下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1904个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2019-6-21 14:34:42 | 显示全部楼层
我就想看看,还隐藏了什么
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-9-1 11:57:36 来自手机 | 显示全部楼层
看题目好像很简单一个功能,怎么写了这么多代码
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 58个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 82个

财富等级: 招财进宝

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

使用道具 举报

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

使用道具 举报

已领礼包: 2963个

财富等级: 家财万贯

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

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 3733个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

发表于 2021-1-21 20:09:37 | 显示全部楼层
好东西,你值得拥有!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 375个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 08:14 , Processed in 0.447774 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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