工具箱相关
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TKCuts.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. namespace CutDGX
  15. {
  16. public partial class TKCuts : Form
  17. {
  18. public TKCuts()
  19. {
  20. InitializeComponent();
  21. }
  22. private void TKCuts_Load(object sender, EventArgs e)
  23. {
  24. //自动填充下拉框
  25. Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  26. using (Transaction traction = database.TransactionManager.StartTransaction())
  27. {
  28. //存放所有图层名
  29. List<string> alllayername = new List<string>();
  30. LayerTable layertable = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
  31. foreach (ObjectId objid in layertable)
  32. {
  33. LayerTableRecord layertablerecord = traction.GetObject(objid, OpenMode.ForRead) as LayerTableRecord;
  34. alllayername.Add(layertablerecord.Name);
  35. }
  36. alllayername.Sort();
  37. for (int i = 0; i < alllayername.Count; i++)
  38. {
  39. this.comboBox_tk.Items.Add(alllayername[i]);
  40. this.comboBox_fwx.Items.Add(alllayername[i]);
  41. }
  42. if (alllayername.Contains("TK"))
  43. {
  44. int index = alllayername.IndexOf("TK");
  45. this.comboBox_tk.SelectedIndex = index;
  46. }
  47. traction.Commit();
  48. }
  49. }
  50. private void button1_Click(object sender, EventArgs e)
  51. {
  52. if (comboBox_tk.Text == "")
  53. {
  54. MessageBox.Show("请选择分幅图框所在图层");
  55. return;
  56. }
  57. if (comboBox_fwx.Text == "")
  58. {
  59. MessageBox.Show("请选择范围线所在图层");
  60. return;
  61. }
  62. string tklyr = comboBox_tk.Text;
  63. string fwxlyr = comboBox_fwx.Text;
  64. cut(tklyr, fwxlyr);
  65. this.Close();
  66. MessageBox.Show("裁剪完成。");
  67. }
  68. public void cut(string tklyr, string fwxlyr)
  69. {
  70. dynamic acadApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  71. acadApp.ZoomExtents();
  72. Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  73. Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  74. // 图框id
  75. List<ObjectId> TKIds = new List<ObjectId>();
  76. // 范围线id
  77. List<ObjectId> boundaryIds = new List<ObjectId>();
  78. //获取分幅图框
  79. TypedValue[] typedvalue = new TypedValue[2];
  80. typedvalue.SetValue(new TypedValue((int)DxfCode.LayerName, tklyr), 0);
  81. typedvalue.SetValue(new TypedValue((int)DxfCode.Start, "Polyline,LWPolyline"), 1);
  82. SelectionFilter selectionfilter = new SelectionFilter(typedvalue);
  83. PromptSelectionResult psr0 = ed.SelectAll(selectionfilter);
  84. if (psr0.Status == PromptStatus.OK)
  85. {
  86. SelectionSet selectionset = psr0.Value;
  87. ObjectId[] obj = new ObjectId[selectionset.Count];
  88. TKIds = selectionset.GetObjectIds().ToList();
  89. }
  90. //获取范围线
  91. TypedValue[] typedvalue1 = new TypedValue[2];
  92. typedvalue1.SetValue(new TypedValue((int)DxfCode.LayerName, fwxlyr), 0);
  93. typedvalue1.SetValue(new TypedValue((int)DxfCode.Start, "Polyline,LWPolyline"), 1);
  94. SelectionFilter selectionfilter1 = new SelectionFilter(typedvalue1);
  95. PromptSelectionResult psr1 = ed.SelectAll(selectionfilter1);
  96. if (psr1.Status == PromptStatus.OK)
  97. {
  98. SelectionSet selectionset = psr1.Value;
  99. ObjectId[] obj = new ObjectId[selectionset.Count];
  100. boundaryIds = selectionset.GetObjectIds().ToList();
  101. }
  102. foreach (var item in boundaryIds)
  103. {
  104. Point3dCollection ptcoll = new Point3dCollection();
  105. DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
  106. using (Transaction trans = db.TransactionManager.StartTransaction())
  107. {
  108. Entity ent = trans.GetObject(item, OpenMode.ForRead) as Entity;
  109. Entity tk = trans.GetObject(TKIds[0], OpenMode.ForRead) as Entity;
  110. string lyr = tk.Layer;
  111. string fw_lyr = ent.Layer;
  112. if (!(ent is Polyline))
  113. {
  114. ed.WriteMessage("范围线必须是多段线");
  115. return;
  116. }
  117. else
  118. {
  119. Polyline pl = (Polyline)ent;
  120. for (int i = 0; i < pl.NumberOfVertices; i++)
  121. ptcoll.Add(pl.GetPoint3dAt(i));
  122. TypedValue[] value = new TypedValue[]
  123. {
  124. new TypedValue((int)DxfCode.LayerName,lyr)
  125. };
  126. SelectionFilter filter = new SelectionFilter(value);
  127. PromptSelectionResult psr = ed.SelectCrossingPolygon(ptcoll, filter);
  128. if (psr.Status == PromptStatus.OK)
  129. {
  130. SelectionSet ss = psr.Value;
  131. List<ObjectId> idcoll = ss.GetObjectIds().ToList();
  132. if (!haslayername("范围内图框"))
  133. creatlayer("范围内图框");
  134. foreach (var selected_id in idcoll)
  135. {
  136. if (TKIds.Contains(selected_id))
  137. {
  138. Entity selected_tk = trans.GetObject(selected_id, OpenMode.ForWrite) as Entity;
  139. if (selected_tk.Layer != fw_lyr)
  140. selected_tk.Layer = "范围内图框";
  141. }
  142. }
  143. }
  144. }
  145. trans.Commit();
  146. }
  147. doclock.Dispose();
  148. }
  149. }
  150. private List<ObjectId> Sele(Editor ed, string wd)
  151. {
  152. List<ObjectId> Ids = new List<ObjectId>();
  153. PromptSelectionOptions SelOpts = new PromptSelectionOptions();
  154. SelOpts.MessageForAdding = "\n" + wd;
  155. // 设置选择过滤器
  156. TypedValue[] FilterList = new TypedValue[] {
  157. new TypedValue((int)DxfCode.Start, "LWPOLYLINE")};
  158. SelectionFilter Filter = new SelectionFilter(FilterList);
  159. PromptSelectionResult SelRes = ed.GetSelection(SelOpts, Filter);
  160. if (SelRes.Status != PromptStatus.OK)
  161. return Ids;
  162. Ids = SelRes.Value.GetObjectIds().ToList();
  163. return Ids;
  164. }
  165. /// <summary>
  166. /// 创建标记层
  167. /// </summary>
  168. /// <param name="layername">要创建的图层的名字</param>
  169. /// <param name="colo">RGB三原色</param>
  170. public void creatlayer(string layername)
  171. {
  172. Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  173. DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
  174. Transaction traction = database.TransactionManager.StartTransaction();
  175. LayerTable lt = traction.GetObject(database.LayerTableId, OpenMode.ForWrite) as LayerTable;
  176. try
  177. {
  178. LayerTableRecord layertablerecord = new LayerTableRecord();
  179. layertablerecord.Name = layername;//设置层表记录的名字
  180. //layertablerecord.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(colo.red, colo.green, colo.blue);//为层表记录赋颜色紫色
  181. //layertablerecord.Color = Autodesk.AutoCAD.Colors.Color.FromColor(System.Drawing.Color.Magenta);
  182. lt.Add(layertablerecord);
  183. traction.AddNewlyCreatedDBObject(layertablerecord, true);
  184. traction.Commit();
  185. }
  186. catch (Autodesk.AutoCAD.Runtime.Exception)
  187. {
  188. traction.Abort();
  189. }
  190. finally
  191. {
  192. traction.Dispose();
  193. doclock.Dispose();
  194. }
  195. }
  196. /// <summary>
  197. /// 将指定图层设置为当前图层
  198. /// </summary>
  199. /// <param name="layername">要设置为当前图层的图层名字</param>
  200. public void movelayertofront(string layername)
  201. {
  202. Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  203. DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
  204. Transaction traction = database.TransactionManager.StartTransaction();
  205. try
  206. {
  207. LayerTable layertable = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
  208. database.Clayer = layertable[layername];//把图层选为当前图层
  209. traction.Commit();
  210. }
  211. catch (Autodesk.AutoCAD.Runtime.Exception)
  212. {
  213. traction.Abort();
  214. }
  215. finally
  216. {
  217. traction.Dispose();
  218. doclock.Dispose();
  219. }
  220. }
  221. /// <summary>
  222. /// 判断所命图层名是否已经存在
  223. /// </summary>
  224. /// <param name="layername">要判断的图层名字</param>
  225. /// <returns>返回true表示在层表中存在要判断的图层名,
  226. /// 返回false表示层表中不存在判断的图层名</returns>
  227. public bool haslayername(string layername)
  228. {
  229. Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
  230. using (Transaction traction = database.TransactionManager.StartTransaction())
  231. {
  232. LayerTable lt = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
  233. if (lt.Has(layername))
  234. {
  235. traction.Commit();
  236. return true;
  237. }
  238. else
  239. {
  240. traction.Commit();
  241. return false;
  242. }
  243. }
  244. }
  245. }
  246. }