123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Geometry;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace CutDGX
- {
- public partial class TKCuts : Form
- {
- public TKCuts()
- {
- InitializeComponent();
- }
-
- private void TKCuts_Load(object sender, EventArgs e)
- {
- //自动填充下拉框
- Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
- using (Transaction traction = database.TransactionManager.StartTransaction())
- {
- //存放所有图层名
- List<string> alllayername = new List<string>();
- LayerTable layertable = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
- foreach (ObjectId objid in layertable)
- {
- LayerTableRecord layertablerecord = traction.GetObject(objid, OpenMode.ForRead) as LayerTableRecord;
- alllayername.Add(layertablerecord.Name);
- }
-
- alllayername.Sort();
-
- for (int i = 0; i < alllayername.Count; i++)
- {
- this.comboBox_tk.Items.Add(alllayername[i]);
- this.comboBox_fwx.Items.Add(alllayername[i]);
- }
-
- if (alllayername.Contains("TK"))
- {
- int index = alllayername.IndexOf("TK");
- this.comboBox_tk.SelectedIndex = index;
- }
- traction.Commit();
- }
- }
-
- private void button1_Click(object sender, EventArgs e)
- {
- if (comboBox_tk.Text == "")
- {
- MessageBox.Show("请选择分幅图框所在图层");
- return;
- }
- if (comboBox_fwx.Text == "")
- {
- MessageBox.Show("请选择范围线所在图层");
- return;
- }
- string tklyr = comboBox_tk.Text;
- string fwxlyr = comboBox_fwx.Text;
- cut(tklyr, fwxlyr);
- this.Close();
- MessageBox.Show("裁剪完成。");
- }
-
- public void cut(string tklyr, string fwxlyr)
- {
- dynamic acadApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
- acadApp.ZoomExtents();
- Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
- Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
-
- // 图框id
- List<ObjectId> TKIds = new List<ObjectId>();
- // 范围线id
- List<ObjectId> boundaryIds = new List<ObjectId>();
-
- //获取分幅图框
- TypedValue[] typedvalue = new TypedValue[2];
- typedvalue.SetValue(new TypedValue((int)DxfCode.LayerName, tklyr), 0);
- typedvalue.SetValue(new TypedValue((int)DxfCode.Start, "Polyline,LWPolyline"), 1);
- SelectionFilter selectionfilter = new SelectionFilter(typedvalue);
- PromptSelectionResult psr0 = ed.SelectAll(selectionfilter);
- if (psr0.Status == PromptStatus.OK)
- {
- SelectionSet selectionset = psr0.Value;
- ObjectId[] obj = new ObjectId[selectionset.Count];
- TKIds = selectionset.GetObjectIds().ToList();
- }
- //获取范围线
- TypedValue[] typedvalue1 = new TypedValue[2];
- typedvalue1.SetValue(new TypedValue((int)DxfCode.LayerName, fwxlyr), 0);
- typedvalue1.SetValue(new TypedValue((int)DxfCode.Start, "Polyline,LWPolyline"), 1);
- SelectionFilter selectionfilter1 = new SelectionFilter(typedvalue1);
- PromptSelectionResult psr1 = ed.SelectAll(selectionfilter1);
- if (psr1.Status == PromptStatus.OK)
- {
- SelectionSet selectionset = psr1.Value;
- ObjectId[] obj = new ObjectId[selectionset.Count];
- boundaryIds = selectionset.GetObjectIds().ToList();
- }
-
- foreach (var item in boundaryIds)
- {
- Point3dCollection ptcoll = new Point3dCollection();
- DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- using (Transaction trans = db.TransactionManager.StartTransaction())
- {
- Entity ent = trans.GetObject(item, OpenMode.ForRead) as Entity;
- Entity tk = trans.GetObject(TKIds[0], OpenMode.ForRead) as Entity;
- string lyr = tk.Layer;
- string fw_lyr = ent.Layer;
- if (!(ent is Polyline))
- {
- ed.WriteMessage("范围线必须是多段线");
- return;
- }
- else
- {
- Polyline pl = (Polyline)ent;
- for (int i = 0; i < pl.NumberOfVertices; i++)
- ptcoll.Add(pl.GetPoint3dAt(i));
- TypedValue[] value = new TypedValue[]
- {
- new TypedValue((int)DxfCode.LayerName,lyr)
- };
- SelectionFilter filter = new SelectionFilter(value);
- PromptSelectionResult psr = ed.SelectCrossingPolygon(ptcoll, filter);
- if (psr.Status == PromptStatus.OK)
- {
- SelectionSet ss = psr.Value;
- List<ObjectId> idcoll = ss.GetObjectIds().ToList();
- if (!haslayername("范围内图框"))
- creatlayer("范围内图框");
- foreach (var selected_id in idcoll)
- {
- if (TKIds.Contains(selected_id))
- {
- Entity selected_tk = trans.GetObject(selected_id, OpenMode.ForWrite) as Entity;
- if (selected_tk.Layer != fw_lyr)
- selected_tk.Layer = "范围内图框";
- }
- }
- }
- }
- trans.Commit();
- }
- doclock.Dispose();
- }
-
- }
-
- private List<ObjectId> Sele(Editor ed, string wd)
- {
- List<ObjectId> Ids = new List<ObjectId>();
- PromptSelectionOptions SelOpts = new PromptSelectionOptions();
- SelOpts.MessageForAdding = "\n" + wd;
-
- // 设置选择过滤器
- TypedValue[] FilterList = new TypedValue[] {
- new TypedValue((int)DxfCode.Start, "LWPOLYLINE")};
- SelectionFilter Filter = new SelectionFilter(FilterList);
-
- PromptSelectionResult SelRes = ed.GetSelection(SelOpts, Filter);
- if (SelRes.Status != PromptStatus.OK)
- return Ids;
- Ids = SelRes.Value.GetObjectIds().ToList();
- return Ids;
- }
-
- /// <summary>
- /// 创建标记层
- /// </summary>
- /// <param name="layername">要创建的图层的名字</param>
- /// <param name="colo">RGB三原色</param>
- public void creatlayer(string layername)
- {
- Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
- DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- Transaction traction = database.TransactionManager.StartTransaction();
- LayerTable lt = traction.GetObject(database.LayerTableId, OpenMode.ForWrite) as LayerTable;
- try
- {
- LayerTableRecord layertablerecord = new LayerTableRecord();
- layertablerecord.Name = layername;//设置层表记录的名字
- //layertablerecord.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(colo.red, colo.green, colo.blue);//为层表记录赋颜色紫色
- //layertablerecord.Color = Autodesk.AutoCAD.Colors.Color.FromColor(System.Drawing.Color.Magenta);
-
- lt.Add(layertablerecord);
- traction.AddNewlyCreatedDBObject(layertablerecord, true);
- traction.Commit();
- }
- catch (Autodesk.AutoCAD.Runtime.Exception)
- {
- traction.Abort();
- }
- finally
- {
- traction.Dispose();
- doclock.Dispose();
- }
- }
-
-
- /// <summary>
- /// 将指定图层设置为当前图层
- /// </summary>
- /// <param name="layername">要设置为当前图层的图层名字</param>
- public void movelayertofront(string layername)
- {
- Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
- DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- Transaction traction = database.TransactionManager.StartTransaction();
- try
- {
- LayerTable layertable = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
- database.Clayer = layertable[layername];//把图层选为当前图层
- traction.Commit();
- }
- catch (Autodesk.AutoCAD.Runtime.Exception)
- {
- traction.Abort();
- }
- finally
- {
- traction.Dispose();
- doclock.Dispose();
- }
- }
-
-
-
- /// <summary>
- /// 判断所命图层名是否已经存在
- /// </summary>
- /// <param name="layername">要判断的图层名字</param>
- /// <returns>返回true表示在层表中存在要判断的图层名,
- /// 返回false表示层表中不存在判断的图层名</returns>
- public bool haslayername(string layername)
- {
- Database database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
- using (Transaction traction = database.TransactionManager.StartTransaction())
- {
- LayerTable lt = traction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
-
- if (lt.Has(layername))
- {
- traction.Commit();
- return true;
- }
- else
- {
- traction.Commit();
- return false;
- }
- }
-
-
-
- }
- }
- }
|