123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856 |
- using GrxCAD.ApplicationServices;
- using GrxCAD.DatabaseServices;
- using GrxCAD.EditorInput;
- using GrxCAD.Geometry;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace HCTools
- {
- class CutContourLine
- {
- public static string sqxlayer;
- public static string jqxlayer;
- public static int mapscale;
- public static double scalelen;
- public static double lenIgnore;
- public static double eledvalue;
- public void ccls()
- {
- DocumentLock documentlock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- Document doc = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- //类全局变量
- //存储地图图层
- //System.Collections.ArrayList layerlist = new System.Collections.ArrayList();
- LayerTable layertable = null;
- bool openflag = true;
- List<Entity> plentitycollection = new List<Entity>();
- List<Entity> plentitycollection1 = new List<Entity>();
- //保存裁剪掉的等高线
- List<Entity> cdentity = new List<Entity>();
-
-
- #region//第一个事务 获取计曲线
- using (Transaction tran = doc.TransactionManager.StartTransaction())
- {
-
- //layertable = tran.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
- ////获取图层
- //foreach (ObjectId id in layertable)
- //{
- // DocumentLock docLock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- // LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord;
- // docLock.Dispose();
- // layerlist.Add(lyrtbrec.Name);
-
- //}
-
- //CLSelectForm clsf = new CLSelectForm(layerlist);
- //if (clsf.ShowDialog() == DialogResult.OK)
- //{
- // openflag = true;
- // mapscale = clsf.mapscale;
- // sqxlayer = clsf.SQX;
- // jqxlayer = clsf.JQX;
- // scalelen = clsf.ScaleLength;
- // lenIgnore = clsf.LenIgnore;
- // eledvalue = clsf.EleDValue;
- //}
-
-
- if (openflag == true)
- {
- ///带1的为首曲线过滤,没有的是计曲线过滤
- TypedValue[] tv = new TypedValue[1];
- TypedValue[] tv1 = new TypedValue[1];
- tv.SetValue(new TypedValue((int)DxfCode.LayerName, jqxlayer), 0);
- tv1.SetValue(new TypedValue((int)DxfCode.LayerName, sqxlayer), 0);
- SelectionFilter sf = new SelectionFilter(tv);
- SelectionFilter sf1 = new SelectionFilter(tv1);
- //doc.Editor.WriteMessage("请选择计曲线!");
-
- //PromptSelectionResult psr = doc.Editor.GetSelection(sf);
- PromptSelectionResult psr = doc.Editor.SelectAll(sf);
- PromptSelectionResult psr1 = doc.Editor.SelectAll(sf1);
-
- if (psr.Status == PromptStatus.OK && psr1.Status == PromptStatus.OK)
- {
- //// 以只读方式打开块表记录 Open the Block table record for read
- BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
- //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write
- BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
- SelectionSet ss = psr.Value;
- //// 以只读方式打开块表记录 Open the Block table record for read
- SelectionSet ss1 = psr1.Value;
-
-
- foreach (ObjectId idpl in ss.GetObjectIds())
- {
- Entity enpl = tran.GetObject(idpl, OpenMode.ForWrite, true) as Entity;
- if (enpl is Polyline)
- {
- Polyline pl = enpl as Polyline;
- if (pl.Elevation != 0)
- {
- plentitycollection.Add(enpl);
- }
- }
- else if (enpl is Polyline2d)
- {
- Polyline2d pl2d = enpl as Polyline2d;
- if (pl2d.Elevation != 0)
- {
- plentitycollection.Add(enpl);
- }
- }
- }
- foreach (ObjectId idp2 in ss1.GetObjectIds())
- {
- Entity enp2 = tran.GetObject(idp2, OpenMode.ForWrite, true) as Entity;
- if (enp2 is Polyline)
- {
- Polyline pl = enp2 as Polyline;
- if (pl.Elevation != 0)
- {
- plentitycollection1.Add(enp2);
- }
- }
- else if (enp2 is Polyline2d)
- {
- Polyline2d pl2d = enp2 as Polyline2d;
- if (pl2d.Elevation != 0)
- {
- plentitycollection1.Add(enp2);
- }
- }
- }
- }
- else
- doc.Editor.WriteMessage("没有选择到任何实体\r\n");
- //////////////////////////////这个气死我了
-
- doc.Editor.WriteMessage("程序开始运行\r\n.........\r\n......\r\n...\r\n");
- tran.Commit();
- tran.Dispose();
- }
- else
- {
- MessageBox.Show("请选择相应的每一个参数!", "警告");
- return;
-
- }
- }//end using
- #endregion
-
- #region//检查、裁剪等高线
- if (plentitycollection.Count > 0)
- {
- //根据高程将计曲线排序
- plentitycollection.Sort(CompareDGXByElevation);
- //删除重叠,重复的等高线
- //int count = RemoveOverlapPolyline(ref plentitycollection);
-
- ////////////////////方便调试 仅此而已
- //List<Polyline2d> test = new List<Polyline2d>();
- //foreach (Entity en in plentitycollection)
- //{
- // Polyline2d pl = en as Polyline2d;
- // if (pl != null)
- // test.Add(pl);
- //}
-
- //List<Polyline> test00 = new List<Polyline>();
- //foreach (Entity en in plentitycollection)
- //{
- // Polyline pl = en as Polyline;
- // if (pl != null)
- // test00.Add(pl);
- //}
- ///////////////////
-
-
-
- //以每条计曲线为循环变量
- for (int i = 0; i < plentitycollection.Count - 1; i++)
- {
- Point3dCollection pt3dcoll = new Point3dCollection();
-
- Entity en1 = plentitycollection[i];
- double ele1 = 0;
- Point2d pten1start = new Point2d();//
- Point2d pten1end = new Point2d();//
-
- if (en1 is Polyline)
- {
- Polyline pl = en1 as Polyline;
- pten1start = new Point2d(pl.StartPoint.X, pl.StartPoint.Y);
- pten1end = new Point2d(pl.EndPoint.X, pl.EndPoint.Y);
-
- ele1 = Convert.ToDouble(pl.Elevation.ToString("f1"));
- pl.GetStretchPoints(pt3dcoll);
- }
- else if (en1 is Polyline2d)
- {
- Polyline2d pl2d = en1 as Polyline2d;
- pten1start = new Point2d(pl2d.StartPoint.X, pl2d.StartPoint.Y);
- pten1end = new Point2d(pl2d.EndPoint.X, pl2d.EndPoint.Y);
-
- ele1 = Convert.ToDouble(pl2d.Elevation.ToString("f1"));
- pl2d.GetStretchPoints(pt3dcoll);
- }
-
- int j = 1;
- Entity en2 = null;
- double ele2 = 0, ele = 0;
- Point2d pten2start = new Point2d();
- Point2d pten2end = new Point2d();
-
- double startlength = 9999999, endlength = 9999999;
-
- //寻找一条等高线(计曲线)相邻的等高线
- while (ele <= ele1 + eledvalue)
- {
- Entity entemp = plentitycollection[j];
- if (entemp is Polyline)
- {
- Polyline pl = entemp as Polyline;
- ele = Convert.ToDouble(pl.Elevation.ToString("f1"));
-
- if (ele == ele1 + eledvalue)
- {
- pten2start = new Point2d(pl.StartPoint.X, pl.StartPoint.Y);
- pten2end = new Point2d(pl.EndPoint.X, pl.EndPoint.Y);
-
- double start = pten1start.GetDistanceTo(pten2start);
- double end = pten1end.GetDistanceTo(pten2end);
-
- //这段代码主要解决相邻有多条等高线时选择距离最近的
- if (startlength > start && endlength > end)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- else if (startlength > start)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- else if (endlength > end)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- }
- }
- else if (entemp is Polyline2d)
- {
- Polyline2d pl2d = entemp as Polyline2d;
- ele = Convert.ToDouble(pl2d.Elevation.ToString("f1"));
-
- if (ele == ele1 + eledvalue)
- {
- pten2start = new Point2d(pl2d.StartPoint.X, pl2d.StartPoint.Y);
- pten2end = new Point2d(pl2d.EndPoint.X, pl2d.EndPoint.Y);
-
- double start = pten1start.GetDistanceTo(pten2start);
- double end = pten1end.GetDistanceTo(pten2end);
-
- if (startlength > start && endlength > end)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- else if (startlength > start)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- else if (endlength > end)
- {
- startlength = start;
- endlength = end;
-
- en2 = entemp;
- ele2 = ele;
- }
- }
- }
- j++;
- if (j > plentitycollection.Count - 1)
- break;
- }
-
- //满足裁剪条件的节点
- Point3dCollection cjcoll = new Point3dCollection();
- bool flag = false;
-
- if (en2 != null)
- {
- //以计曲线节点为循环
- for (int ii = 0; ii < pt3dcoll.Count; ii++)
- {
- Point3d pt3d = pt3dcoll[ii];
-
- Point3d temppt3d = new Point3d();
- temppt3d = GetClosestPoint(pt3d, en2);
-
- //临时计算两个3d点之间的平面距离
- Point2d pt2d1 = new Point2d(pt3d.X, pt3d.Y);
- Point2d pt2d2 = new Point2d(temppt3d.X, temppt3d.Y);
-
- double length = pt2d1.GetDistanceTo(pt2d2);
- if (length < scalelen)
- {
- //flag为false标志继续添加满足条件节点
- //flag为true标志结束添加节点,进行后续计算
-
- if (ii == pt3dcoll.Count - 1)//最后一组节点
- {
- flag = true;
- }
- else
- {
- cjcoll.Add(pt3d);
- cjcoll.Add(temppt3d);
- }
- }
- else
- {
- flag = true;
- }
- if (flag == true)
- {
- if (cjcoll.Count > 0)
- {
- if (cjcoll.Count > 3)
- {
- //矩形框四个角点
- //选取2个为裁剪的两个节点
- //为计曲线上的点
- Point3d pt1cjnode = new Point3d();
- Point3d pt2node = new Point3d();
- Point3d pt3cjnode = new Point3d();
- Point3d pt4node = new Point3d();
-
- pt1cjnode = cjcoll[0];
- pt2node = cjcoll[1];
- pt3cjnode = cjcoll[cjcoll.Count - 2];
- pt4node = cjcoll[cjcoll.Count - 1];
-
- Point3dCollection rectcj = new Point3dCollection();
- rectcj.Add(pt1cjnode);
- rectcj.Add(pt2node);
- rectcj.Add(pt3cjnode);
- rectcj.Add(pt4node);
-
- #region
- Point2d pt2djudge1 = new Point2d(pt1cjnode.X, pt1cjnode.Y);
- Point2d pt2djudge2 = new Point2d(pt3cjnode.X, pt3cjnode.Y);
-
- if (pt2djudge1.GetDistanceTo(pt2djudge2) > lenIgnore)
- {
- #region//画裁剪线
- ////using (Transaction tran = doc.TransactionManager.StartTransaction())
- ////{
-
- //// //// 以只读方式打开块表记录 Open the Block table record for read
- //// BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
- //// //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write
- //// BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
-
- //// //设置激活图层
- //// layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
- //// if (!layertable.Has("CJX"))
- //// {
- //// LayerTableRecord ltr = new LayerTableRecord();
- //// ltr.Name = "CJX";
- //// ObjectId layerid = layertable.Add(ltr);
- //// tran.AddNewlyCreatedDBObject(ltr, true);
- //// db.Clayer = layerid;
- //// }
- //// else
- //// {
- //// //设置首曲线为当期激活图层
- //// foreach (ObjectId id in layertable)
- //// {
- //// LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord;
- //// if (lyrtbrec.Name == "CJX")
- //// db.Clayer = id;
- //// }
- //// }
-
- //// Polyline3d cjxpl = new Polyline3d(Poly3dType.SimplePoly, cjcoll, false);
-
- //// cjxpl.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Blue);
- //// acblr.AppendEntity(cjxpl);
- //// cjxpl.Layer = "CJX";
- //// tran.AddNewlyCreatedDBObject(cjxpl, true);
-
- //// //doc.Editor.WriteMessage("");
-
- //// tran.Commit();
- //// tran.Dispose();
- ////}
- #endregion
-
- double Xmin = 9999999999, Xmax = 0, Ymin = 9999999999, Ymax = 0;
- //获取该点集的最大值最小值
- foreach (Point3d pt3dcorner in cjcoll)
- {
- if (Xmin >= pt3dcorner.X)
- Xmin = pt3dcorner.X;
- if (Xmax < pt3dcorner.X)
- Xmax = pt3dcorner.X;
- if (Ymin >= pt3dcorner.Y)
- Ymin = pt3dcorner.Y;
- if (Ymax < pt3dcorner.Y)
- Ymax = pt3dcorner.Y;
- }
- if (Xmin > Xmax)
- {
- double tempt = 0;
- tempt = Xmin;
- Xmin = Xmax;
- Xmax = tempt;
- }
-
- if (Ymin > Ymax)
- {
- double tempt = 0;
- tempt = Ymin;
- Ymin = Ymax;
- Ymax = tempt;
- }
- #region//设置视图
- //设置当前视图
- ViewTableRecord viewtr = new ViewTableRecord();
- viewtr.CenterPoint = new Point2d(Xmin + (Xmax - Xmin) / 2, Ymin + (Ymax - Ymin) / 2);
- viewtr.ViewDirection = new Vector3d(0, 0, 1);
- viewtr.Height = Ymax - Ymin + 100;
- viewtr.Width = Xmax - Xmin + 100;
- doc.Editor.SetCurrentView(viewtr);
- #endregion
-
- //对选择到的首曲线进行处理
- string stttr = "";
- TypedValue[] tvtemp = new TypedValue[1];
- tvtemp.SetValue(new TypedValue((int)DxfCode.LayerName, sqxlayer), 0);
- SelectionFilter sftemp = new SelectionFilter(tvtemp);
- PromptSelectionResult psrtempt = doc.Editor.SelectCrossingWindow(new Point3d(Xmin, Ymin, 0), new Point3d(Xmax, Ymax, 0), sftemp);
- if (psrtempt.Status == PromptStatus.OK)
- {
- SelectionSet sstempt = psrtempt.Value;
- #region
- using (Transaction tran = doc.TransactionManager.StartTransaction())
- {
- //// 以只读方式打开块表记录 Open the Block table record for read
- BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
- //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write
- BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
-
- //设置激活图层
- layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
-
- //设置首曲线为当期激活图层
- foreach (ObjectId id in layertable)
- {
- LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord;
- if (lyrtbrec.Name == sqxlayer)
- db.Clayer = id;
- }
- foreach (ObjectId oidtempt in sstempt.GetObjectIds())
- {
- Entity entempt = tran.GetObject(oidtempt, OpenMode.ForWrite) as Entity;
-
- //if (ele1 > ele2)
- //{
- // double tempt = 0;
- // tempt = ele1;
- // ele1 = ele2;
- // ele2 = tempt;
- //}
-
- if (entempt is Polyline)
- {
- Polyline pltempt = entempt as Polyline;
- if (Convert.ToDouble(pltempt.Elevation.ToString("f1")) > ele1 && Convert.ToDouble(pltempt.Elevation.ToString("f1")) < ele2)
- {
- //裁剪节点集
- Point3dCollection pt3dcolltempt = new Point3dCollection();
- //裁剪节点集
- Point3dCollection pt3dcolltempt2 = new Point3dCollection();
-
-
- //裁剪节点
- Point3d pt3dtt1 = pltempt.GetClosestPointTo(pt1cjnode, false);
- Point3d pt3dtt2 = pltempt.GetClosestPointTo(pt3cjnode, false);
-
- //将线端点以外的点添加进裁剪接节点
- if (pt3dtt1 != new Point3d())
- {
- if (pt3dtt1 != pltempt.StartPoint && pt3dtt1 != pltempt.EndPoint)
- pt3dcolltempt.Add(pt3dtt1);
- }
- if (pt3dtt2 != new Point3d())
- {
- if (pt3dtt2 != pltempt.StartPoint && pt3dtt2 != pltempt.EndPoint)
- pt3dcolltempt.Add(pt3dtt2);
- }
- stttr += pltempt.StartPoint.X + "," + pltempt.StartPoint.Y + "," + pltempt.StartPoint.Z + "!" + pltempt.EndPoint.X + ","
- + pltempt.EndPoint.Y + "," + pltempt.EndPoint.Z + "\r\n";
- stttr += pt3dtt1.X + "@" + pt3dtt1.Y + "@" + pt3dtt1.Z + "!" + pt3dtt2.X + "@" + pt3dtt2.Y + "@" + pt3dtt2.Z + "\r\n";
- if (pt3dcolltempt.Count > 0)
- {
- for (int ch = 0; ch < pt3dcolltempt.Count; ch++)
- {
- pt3dcolltempt2.Add(pt3dcolltempt[pt3dcolltempt.Count - 1 - ch]);
- }
-
-
- DBObjectCollection dbojcoll = null;
- DBObjectCollection dbojcoll2 = null;
- try
- {
- dbojcoll = pltempt.GetSplitCurves(pt3dcolltempt);
- }
- catch { }
- try
- {
- dbojcoll2 = pltempt.GetSplitCurves(pt3dcolltempt2);
- }
- catch { }
-
- if (dbojcoll2.Count > dbojcoll.Count)
- dbojcoll = dbojcoll2;
- //if (dbojcoll.Count >0)
- if (dbojcoll.Count < 1)
- continue;
- //{
- if (pltempt.Closed)//如果该线闭合
- {
- foreach (DBObject enen in dbojcoll)
- {
- Polyline plcjh = enen as Polyline;
- Point3dCollection ptcolltempt3d = new Point3dCollection();
- plcjh.GetStretchPoints(ptcolltempt3d);
- Point3d ptptpt = ptcolltempt3d[(int)(ptcolltempt3d.Count / 2)];
- //Point3d ptptpt = ptcolltempt3d[1];
- Point2d ptinen1 = new Point2d();
- Point2d ptinen2 = new Point2d();
- //double llen = 9999;
- if (en1 is Polyline)
- {
- Polyline plen1 = en1 as Polyline;
- Point3d mypt = plen1.GetClosestPointTo(ptptpt, false);
- ptinen1 = new Point2d(mypt.X, mypt.Y);
-
- //llen = plen1.GetClosestPointTo(ptptpt, false).DistanceTo(ptptpt);
- }
- else if (en1 is Polyline2d)
- {
- Polyline2d pl2den1 = en1 as Polyline2d;
-
- Point3d mypt = pl2den1.GetClosestPointTo(ptptpt, false);
- ptinen1 = new Point2d(mypt.X, mypt.Y);
- //llen = pl2den1.GetClosestPointTo(ptptpt, false).DistanceTo(ptptpt);
- }
- if (en2 is Polyline)
- {
- Polyline plen2 = en2 as Polyline;
- Point3d mypt = plen2.GetClosestPointTo(ptptpt, false);
- ptinen2 = new Point2d(mypt.X, mypt.Y);
- }
- else if (en2 is Polyline2d)
- {
- Polyline2d pl2den2 = en2 as Polyline2d;
-
- Point3d mypt = pl2den2.GetClosestPointTo(ptptpt, false);
- ptinen2 = new Point2d(mypt.X, mypt.Y);
- }
- double llen = 9999;
- if ((ptinen1 != new Point2d()) && (ptinen2 != new Point2d()))
- {
- llen = ptinen1.GetDistanceTo(ptinen2);
- }
- if (llen < scalelen)
- {
- cdentity.Add(plcjh);
- }
- else
- {
- acblr.AppendEntity(plcjh);
- plcjh.Layer = sqxlayer;
- tran.AddNewlyCreatedDBObject(plcjh, true);
- }
- }
- }
- else
- {
- foreach (DBObject enen in dbojcoll)
- {
-
- Polyline plcjh = enen as Polyline;
- Point2d startpoint = new Point2d(plcjh.StartPoint.X, plcjh.StartPoint.Y);
- Point2d endpoint = new Point2d(plcjh.EndPoint.X, plcjh.EndPoint.Y);
-
- double linelength = startpoint.GetDistanceTo(endpoint);
-
- if (linelength > 1.5 * mapscale)
- {
- //if ((plcjh.GetClosestPointTo(pt3dtt1, false) == pt3dtt1) && (plcjh.GetClosestPointTo(pt3dtt2, false) == pt3dtt2))
- if ((pt3dtt1 == plcjh.StartPoint || pt3dtt1 == plcjh.EndPoint) && (pt3dtt2 == plcjh.StartPoint || pt3dtt2 == plcjh.EndPoint))
- {
- cdentity.Add(plcjh);
- }
- else
- {
- acblr.AppendEntity(plcjh);
- plcjh.Layer = sqxlayer;
- tran.AddNewlyCreatedDBObject(plcjh, true);
- }
- }
- else
- cdentity.Add(plcjh);
- }
- }
- //}
- entempt.Erase(true);
- //tran.Commit();
- }
-
- }
- }
- else if (entempt is Polyline2d)
- {
- ////裁剪二维多段线代码
-
- Polyline2d pl2dtempt = entempt as Polyline2d;
- if (Convert.ToDouble(pl2dtempt.Elevation.ToString("f1")) > ele1 && Convert.ToDouble(pl2dtempt.Elevation.ToString("f1")) < ele2)
- {
- Point3dCollection pt3dcolltempt = new Point3dCollection();
- Point3d pt3dtt1 = pl2dtempt.GetClosestPointTo(pt1cjnode, false);
- Point3d pt3dtt2 = pl2dtempt.GetClosestPointTo(pt3cjnode, false);
-
- //将线端点以外的点添加进裁剪接节点
- if (pt3dtt1 != new Point3d())
- {
- if (pt3dtt1 != pl2dtempt.StartPoint && pt3dtt1 != pl2dtempt.EndPoint)
- pt3dcolltempt.Add(pt3dtt1);
- }
- if (pt3dtt2 != new Point3d())
- {
- if (pt3dtt2 != pl2dtempt.StartPoint && pt3dtt2 != pl2dtempt.EndPoint)
- pt3dcolltempt.Add(pt3dtt2);
- }
- if (pt3dcolltempt.Count > 0)
- {
- Polyline pltempt = new Polyline();
- Point3dCollection pt3dpl2dcoll = new Point3dCollection();
- pl2dtempt.GetStretchPoints(pt3dpl2dcoll);
- //foreach (Point3d pt in pt3dpl2dcoll)
- //{
- // pltempt.AddVertexAt(0,pt,0,0,0);
- //}
-
- DBObjectCollection dbojcoll = pl2dtempt.GetSplitCurves(pt3dcolltempt);
- if (dbojcoll.Count>0)
- {
- foreach (DBObject enen in dbojcoll)
- {
- Polyline2d pl2dcjh = enen as Polyline2d;
-
- Point2d startpoint = new Point2d(pl2dcjh.StartPoint.X, pl2dcjh.StartPoint.Y);
- Point2d endpoint = new Point2d(pl2dcjh.EndPoint.X, pl2dcjh.EndPoint.Y);
-
- double linelength = startpoint.GetDistanceTo(endpoint);
-
- if (linelength > 1.5 * mapscale)
- {
-
- if ((pl2dcjh.GetClosestPointTo(pt3dtt1, false) == pt3dtt1) && (pl2dcjh.GetClosestPointTo(pt3dtt2, false) == pt3dtt2))
- if ((pt3dtt1 == pl2dcjh.StartPoint || pt3dtt1 == pl2dcjh.EndPoint) && (pt3dtt2 == pl2dcjh.StartPoint || pt3dtt2 == pl2dcjh.EndPoint))
- {
- cdentity.Add(pl2dcjh);
- }
- else
- {
- acblr.AppendEntity(pl2dcjh);
- pl2dcjh.Layer = sqxlayer;
- tran.AddNewlyCreatedDBObject(pl2dcjh, true);
- }
- }
- else
- cdentity.Add(pl2dcjh);
- }
-
- }
- entempt.Erase(true);
- tran.Commit();
- }
- }
-
-
- }
-
- #region//画裁剪线
- //Polyline3d cjxpl = new Polyline3d(Poly3dType.SimplePoly, rectcj, false);
- //if (!layertable.Has("CJX"))
- //{
- // LayerTableRecord ltr = new LayerTableRecord();
- // ltr.Name = "CJX";
- // ObjectId layerid = layertable.Add(ltr);
- // tran.AddNewlyCreatedDBObject(ltr, true);
- // //db.Clayer = layerid;
- //}
-
- //cjxpl.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Blue);
- //acblr.AppendEntity(cjxpl);
- //cjxpl.Layer = "CJX";
- //tran.AddNewlyCreatedDBObject(cjxpl, true);
- ////doc.Editor.WriteMessage("");
- #endregion
-
- }
-
- tran.Commit();
- tran.Dispose();
- }
- #endregion
- }
-
- }
-
- }
- cjcoll.Clear();
- cjcoll = new Point3dCollection();
- }
-
- flag = false;
- continue;
- }//end if
- else
- {
- continue;
- }
- }
- }
- }
- }
- else
- return;
- #endregion
- #region
- ///画裁剪掉的线
- if (cdentity.Count > 0)
- {
- using (Transaction tran = doc.TransactionManager.StartTransaction())
- {
-
- //// 以只读方式打开块表记录 Open the Block table record for read
- BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
- //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write
- BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
-
- //设置激活图层
- layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
- if (!layertable.Has("CJSQX"))
- {
- LayerTableRecord ltr = new LayerTableRecord();
- ltr.Name = "CJSQX";
- ObjectId layerid = layertable.Add(ltr);
- tran.AddNewlyCreatedDBObject(ltr, true);
- db.Clayer = layerid;
- }
- else
- {
- foreach (ObjectId id in layertable)
- {
- LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord;
- if (lyrtbrec.Name == "CJSQX")
- db.Clayer = id;
- }
- }
-
- foreach (Entity enenen in cdentity)
- {
- enenen.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Red);
- acblr.AppendEntity(enenen);
- enenen.Layer = "CJSQX";
- tran.AddNewlyCreatedDBObject(enenen, true);
- }
-
- doc.Editor.WriteMessage("已完成裁剪\r\n裁剪掉的等高线都放在CJSQX图层中\r\n");
-
- tran.Commit();
- tran.Dispose();
- }
- }
- #endregion
- documentlock.Dispose();
- doc.Editor.WriteMessage("程序运行结束");
- }
- public static int CompareDGXByElevation(Entity en1, Entity en2)
- {
- double ele1 = 0, ele2 = 0;
- //because just Polyline and Polyline2d two class in plentitycollection
- if (en1 is Polyline)
- {
- Polyline pl = en1 as Polyline;
- ele1 = Convert.ToDouble(pl.Elevation.ToString("f1"));
- }
- else
- {
- Polyline2d pl2d = en1 as Polyline2d;
- ele1 = Convert.ToDouble(pl2d.Elevation.ToString("f1"));
- }
-
- if (en2 is Polyline)
- {
- Polyline pl = en2 as Polyline;
- ele2 = Convert.ToDouble(pl.Elevation.ToString("f1"));
- }
- else
- {
- Polyline2d pl2d = en2 as Polyline2d;
- ele2 = Convert.ToDouble(pl2d.Elevation.ToString("f1"));
- }
-
- return (int)(ele1 - ele2);
-
- }
- public static Point3d GetClosestPoint(Point3d pt, Entity enpl)
- {
- if (enpl is Polyline)
- {
- Polyline pl = enpl as Polyline;
- return pl.GetClosestPointTo(pt, true);
- }
- else
- {
- Polyline2d pl2d = enpl as Polyline2d;
- return pl2d.GetClosestPointTo(pt, true);
- }
- }
- #endregion
- }
- }
|