找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2810|回复: 32

[每日一码] 使用JOIN命令连接多段线时候保留XDATA数据

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-10-19 00:18:54 | 显示全部楼层 |阅读模式

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

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

×
问题:
我的程序在(AcDb2dPolyline)的每个顶点都附加了XDATA数据,当我使用JOIN命令连接另外一个多段线的时候,顶点的XDATA数据丢失,我如何能防止这样?

解决方案:
在使用JOIN命令的时候,AUTOCAD不会保留2D多段线顶点的XDATA数据,解决方法是写一个命令实现JOIN命令功能的同时保留住XDATA数据,下面C#代码演示如何实现。注意,通过UNDEFINE命令注销掉JOIN命令然后把自己的命令定义成JOIN,用户就像还在使用JOIN命令一样。

[it618postdisplay>0] // Define Command "njoin"[/it618postdisplay]
[sell=5]
  1. [CommandMethod("join")]
  2. static public void njoin()
  3. {
  4.     //Code to replace the AutoCAD's join command.
  5.     //Please not that minimal error checking is done for code brevity

  6.     //Select the source entity
  7.     PromptEntityResult pEntrs;
  8.     pEntrs = Application.DocumentManager.MdiActiveDocument.Editor.GetEntity("\nSelect source polyline: ");


  9.     if(PromptStatus.OK != pEntrs.Status) return;


  10.     ObjectId srcId = pEntrs.ObjectId;


  11.     pEntrs = Application.DocumentManager.MdiActiveDocument.Editor.GetEntity("\nSelect polyline to join: ");


  12.     if(PromptStatus.OK != pEntrs.Status) return;


  13.     ObjectId joinId = pEntrs.ObjectId;


  14.     Transaction trans = null;
  15.     try
  16.     {
  17.         trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
  18.         Polyline2d srcPLine = (Polyline2d)trans.GetObject(srcId, OpenMode.ForRead); //will throw error if the entity is not a polyline
  19.         Polyline2d addPLine = (Polyline2d)trans.GetObject(joinId, OpenMode.ForRead); //will throw error if the entity is not a polyline
  20.         System.Collections.IEnumerator destItr = addPLine.GetEnumerator();
  21.         System.Collections.IEnumerator srctItr = srcPLine.GetEnumerator();
  22.       
  23.         //Get the last point of the source polyline
  24.         ObjectId srcLastVertId = ObjectId.Null;
  25.         while (false != srctItr.MoveNext())
  26.         {
  27.             srcLastVertId = (ObjectId)srctItr.Current;
  28.         }                                               


  29.         //Check if the first point or the last point is same as the src polylines end point


  30.         //Get all the vertices of the second polyline
  31.         ObjectIdCollection ids = new ObjectIdCollection();
  32.         while (false != destItr.MoveNext())
  33.         {
  34.             ids.Add((ObjectId)destItr.Current);
  35.         }


  36.         //Check which vertex is same as that of the last vertex of the src polyline
  37.         Vertex2d srcLastVert = (Vertex2d) trans.GetObject((ObjectId)srcLastVertId, OpenMode.ForRead);
  38.         Vertex2d addVert = (Vertex2d) trans.GetObject((ObjectId)ids[0], OpenMode.ForRead);


  39.         int ctr, step;
  40.         if(srcLastVert.Position == addVert.Position)
  41.         {
  42.             ctr = 0; step = 1;
  43.         }
  44.         else
  45.         {                     
  46.             addVert = (Vertex2d) trans.GetObject((ObjectId)ids[ids.Count - 1], OpenMode.ForRead);
  47.             if(srcLastVert.Position == addVert.Position)
  48.             {
  49.                 ctr = ids.Count - 1; step = -1;
  50.             }
  51.             else
  52.             {
  53.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nEnd points do not match.");
  54.                 //neither the first or the last point matches, hence quit
  55.                 throw new System.Exception();
  56.             }
  57.         }
  58.         srcPLine.UpgradeOpen();
  59.         for(int ctr1 = 0; ctr1 < ids.Count;ctr1++)
  60.         {
  61.             addVert = (Vertex2d) trans.GetObject((ObjectId)ids[ctr], OpenMode.ForRead);
  62.             Vertex2d vertClone = (Vertex2d)addVert.Clone();
  63.             srcPLine.AppendVertex(vertClone);
  64.             trans.AddNewlyCreatedDBObject(vertClone, true);
  65.             ctr += step;
  66.         }     
  67.         trans.Commit();
  68.         trans.Dispose();
  69.         //Delete the old polyline
  70.         trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
  71.         addPLine = (Polyline2d)trans.GetObject(joinId, OpenMode.ForWrite);                                            
  72.         addPLine.Erase();
  73.         //Commit the transaction
  74.         trans.Commit();

  75.         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nAdded " + ctr.ToString() +" vertices.");
  76.     }
  77.     catch (System.Exception es)
  78.     {
  79.         //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(es.Message);
  80.     }
  81.     finally   
  82.     {
  83.         trans.Dispose();
  84.     }
  85. }

[/sell]

评分

参与人数 1D豆 +5 收起 理由
ScmTools + 5 资料分享奖!

查看全部评分

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

已领礼包: 2471个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2016-11-17 13:32:34 | 显示全部楼层
学习学习。。。

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

使用道具 举报

已领礼包: 1904个

财富等级: 堆金积玉

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 3913个

财富等级: 富可敌国

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

使用道具 举报

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1632个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 21:27 , Processed in 0.224639 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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