123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- 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;
-
- namespace HCTools
- {
- class FeatureOverlap
- {
-
- //比例尺
- public static int blc;
- //重叠地物数量
- private int number = 0;
- public void check()
- {
- LayerControl lc = new LayerControl();
- if (lc.haslayername("地物重叠") == false)
- {
- lc.creatlayer("地物重叠", new colorgb(255, 0, 255));
- lc.movelayertofront("地物重叠");
- }
- else
- {
- lc.movelayertofront("地物重叠");
- }
- //选择块
- selecblock();
- search(blocklist,entitylist);
- }
-
- /// <summary>
- /// 定义一个块类,主要包括位置和名字
- /// </summary>
- public struct Block
- {
- public double x;
- public double y;
- public double z;
- public string name;
-
- public Block(double x, double y, double z, string name)
- {
- this.x = x;
- this.y = y;
- this.z = z;
- this.name = name;
- }
- }
-
- //块列表
- private List<Block> blocklist = new List<Block>();
- private List<Entity> entitylist = new List<Entity>();
- private void selecblock()
- {
- Document document = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
- Database database = HostApplicationServices.WorkingDatabase;
- DocumentLock documentlock = null;
- Transaction traction = null;
- try
- {
- traction = database.TransactionManager.StartTransaction();
- documentlock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- BlockTable blocktable = traction.GetObject(database.BlockTableId,
- OpenMode.ForRead) as BlockTable;
- Editor editor = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
- TypedValue[] typedvalue = new TypedValue[1];
- typedvalue.SetValue(new TypedValue((int)DxfCode.Start, "Insert"), 0);
- SelectionFilter selectionfilter = new SelectionFilter(typedvalue);
- PromptSelectionResult psr = editor.GetSelection(selectionfilter); ///手动选择块参照
- //PromptSelectionResult psr = editor.SelectAll();
- if (psr.Status == PromptStatus.OK)
- {
- SelectionSet selectionset = psr.Value;
- ObjectId[] obj = new ObjectId[selectionset.Count];
- obj = selectionset.GetObjectIds();
- for (int i = 0; i < obj.Length; i++)
- {
- ObjectId objid = obj[i];
- Entity entity = (Entity)traction.GetObject(objid, OpenMode.ForWrite);
- if (entity is BlockReference)
- {
- BlockReference block = entity as BlockReference;
- ObjectId id = block.BlockTableRecord;
- BlockTableRecord blocktablerecord = traction.GetObject(id,
- OpenMode.ForRead) as BlockTableRecord;
- string blockname = blocktablerecord.Name.ToLower();
- Block blc = new Block();
- ///块参照的位置
- blc.x = block.Position.X;
- blc.y = block.Position.Y;
- blc.z = block.Position.Z;
- blc.name = blockname;
- ///块参照的名称
- switch (blockname)
- {
- case "gc028":
- case "gc090":
- case "gc110":
- case "gc111":
- case "gc119":
- case "gc120":
- case "gc121":
- case "gc122":
- case "gc124":
- case "gc125":
- case "gc126":
- case "gc143":
- case "gc144":
- case "gc145":
- case "gc160":
- case "gc163":
- case "gc164":
- case "gc165":
- case "gc200":
- case "gc205":
- case "gc206":
- case "gc207":
- case "gc208":
- case "gc210":
- case "gc211":
- case "gc213":
- case "gc246":
- case "gc251":
- case "gc253":
- case "gc254":
- case "gc319":
- case "gc320":
- case "gc322":
- case "gc323":
- case "gc325":
- case "gc326":
- entitylist.Add(entity);
- blocklist.Add(blc);
- break;
- case "gc170":
- if (block.Layer == "9000")
- {
- entitylist.Add(entity);
- blocklist.Add(blc);
- }
- break;
-
- default:
- break;
- }
- }
- }
- editor.WriteMessage("\n" + "选中块数量:" + blocklist.Count.ToString());
- }
- traction.Commit();
- }
- catch (GrxCAD.Runtime.Exception)
- {
- traction.Abort();
- return;
- }
- finally
- {
- traction.Dispose();
- documentlock.Dispose();
- }
- }
-
-
- /// <summary>
- /// 寻找与上面已选实体相交的那部分
- /// </summary>
- /// <param name="list"></param>
- public void search(List<Block> list, List<Entity> list1)
- {
- Database database = HostApplicationServices.WorkingDatabase;
- Transaction traction = null;
- DocumentLock documentlock = null;
- try
- {
- Editor editor = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
- for (int i = 0; i < list.Count; i++)
- {
- double x = Math.Round((double)list[i].x, 3, MidpointRounding.AwayFromZero);
- double y = Math.Round((double)list[i].y, 3, MidpointRounding.AwayFromZero);
- Entity entity1 = list1[i];
- string name = list[i].name;
- rebound reb = get_boundary(name);
- double height = reb.height;
- double width = reb.width;
- int type = reb.type;
- ///按照比例尺决定大小
- if (blc == 1000)
- {
- height = height / 2;
- width = width / 2;
- }
- else if (blc == 500)
- {
- height = height / 4;
- width = width / 4;
- }
- else if (blc == 2000)
- {
- height = height * 1;
- width = width * 1;
- }
- ///是为了获得四个角,好框选整个图形
- Point3d p1 = new Point3d(x - width, y, 0);
- Point3d p2 = new Point3d(x + width, y, 0);
- Point3d p3 = new Point3d(x + width, y + height, 0);
- Point3d p4 = new Point3d(x - width, y + height, 0);
- if (type == 2)
- {
- p1 = new Point3d(x - width, y - height, 0);
- p2 = new Point3d(x + width, y - height, 0);
- p3 = new Point3d(x + width, y + height, 0);
- p4 = new Point3d(x - width, y + height, 0);
- }
- else if (type == 3)
- {
- p1 = new Point3d(x - width, y - height, 0);
- p2 = new Point3d(x + width, y - height, 0);
- p3 = new Point3d(x + width, y, 0);
- p4 = new Point3d(x - width, y, 0);
- }
- using (Transaction acTrans = database.TransactionManager.StartTransaction())
- {
- ViewTableRecord currview = editor.GetCurrentView();
- currview.CenterPoint = new Point2d(x, y);
- currview.ViewDirection = new Vector3d(0, 0, 1);
- currview.Width = 40;
- currview.Height = 40;
- editor.SetCurrentView(currview);
- acTrans.Commit();
- }
-
- PromptSelectionResult pselectresult = editor.SelectCrossingWindow(p1, p3);///框选范围内相交的实体
- ///如果有,按照类型对相交实体进行判断
-
- traction = database.TransactionManager.StartTransaction();
- documentlock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
- BlockTable blocktable = traction.GetObject(database.BlockTableId,
- OpenMode.ForRead) as BlockTable;
- BlockTableRecord blocktablerecord = traction.GetObject(blocktable[BlockTableRecord.ModelSpace],
- OpenMode.ForWrite) as BlockTableRecord;
- if (pselectresult.Status == PromptStatus.OK)
- {
- SelectionSet selectionset = pselectresult.Value;
- ObjectId[] obj = new ObjectId[selectionset.Count];
- obj = selectionset.GetObjectIds();
- int count = 0;
- for (int j = 0; j < obj.Length; j++)
- {
- ObjectId objid = obj[j];
- Entity entity = (Entity)traction.GetObject(objid, OpenMode.ForWrite);
- ///块参照
- if (entity is BlockReference)
- {
- BlockReference cblock = entity as BlockReference;
- ObjectId cid = cblock.BlockTableRecord;
- BlockTableRecord crecord = traction.GetObject(cid,
- OpenMode.ForRead) as BlockTableRecord;
- string blockname = crecord.Name.ToLower();
- if (blockname != "gc086")
- {
- count++;
- }
- }
- ///文字
- else if (entity is DBText)
- {
- string layer = entity.Layer;
- if (layer != "0")
- {
- if (entity1 is BlockReference)
- {
- BlockReference cblock = entity1 as BlockReference;
- DBText txt = entity as DBText;
- if (cblock.Position.Z.ToString("N1") != txt.TextString)
- count++;
- }
- }
- }
- ///线
- else if (entity is Polyline || entity is Polyline2d)
- {
- string layer = entity.Layer;
- if (layer == "4400" || layer == "6100" || layer == "4300" || layer == "2000")
- {
- if (name != "gc200")
- {
- count++;
- }
- }
- }
-
- }
- if (count > 1)
- {
- double height1 = 2 * height;
- Point3d orip = new Point3d(x, y, 0);
- Point3d newp = new Point3d(x, y + height1, 0);
- if (name == "gc120" || name == "gc119" || name == "gc126" || name == "gc123" || name == "gc325" || name == "gc205"
- || name == "gc206" || name == "gc207" || name == "gc125" || name == "gc165" || name == "gc326" || name == "gc170"
- || name == "gc160" || name == "gc246" || name == "gc208" || name == "gc121" || name == "gc163" || name == "gc164"
- || name == "gc090" || name == "gc124" || name == "gc379")
- {
- if (entity1.IsWriteEnabled == true)
- {
- Move(entity1, orip, newp);
- }
- }
-
- double px1 = p1.X;
- double py1 = p1.Y;
- double px2 = p2.X;
- double py2 = p2.Y;
- double px3 = p3.X;
- double py3 = p3.Y;
- double px4 = p4.X;
- double py4 = p4.Y;
- p1 = new Point3d(px1, py1 + height1, 0);
- p2 = new Point3d(px2, py2 + height1, 0);
- p3 = new Point3d(px3, py3 + height1, 0);
- p4 = new Point3d(px4, py4 + height1, 0);
- Point3dCollection coll = new Point3dCollection();
- coll.Add(p1);
- coll.Add(p2);
- coll.Add(p3);
- coll.Add(p4);
- Polyline2d line2d = new Polyline2d(Poly2dType.SimplePoly, coll, 0, true, 0, 0, null);
- line2d.SetDatabaseDefaults();
- line2d.Layer = "地物重叠";
- blocktablerecord.AppendEntity(line2d);
- traction.AddNewlyCreatedDBObject(line2d, true);
- number++;
- }
- }
- traction.Commit();
- }
- editor.WriteMessage("\n");
- editor.WriteMessage("检测到重叠地物:" + number);
- editor.WriteMessage("\n");
- number = 0;
- }
- catch (GrxCAD.Runtime.Exception)
- {
- traction.Abort();
- return;
- }
- finally
- {
- if (documentlock != null)
- {
- documentlock.Dispose();
- }
- if (traction != null)
- {
- traction.Dispose();
- }
- }
- }
-
- /// <summary>
- /// type=1表示图形为上半部分,type=2表示图形为上下两部分,type=3表示下半部分(中心点跟图形的关系)
- /// </summary>
- private struct rebound
- {
- public double height;
- public double width;
- public int type;
-
- public rebound(double height, double width, int type)
- {
- this.height = height;
- this.width = width;
- this.type = type;
- }
- }
-
- /// <summary>
- /// 对每个地物图标的大小进行绘制
- /// </summary>
- /// <param name="name"></param>
- /// <returns></returns>
- private rebound get_boundary(string name)
- {
- double height = 0;
- double width = 0;
- int type = 0;
-
- switch (name)
- {
- case "gc028":
- height = 5;
- width = 4;
- type = 2;
- break;
- case "gc090":
- height = 2.5;
- width = 2.5;
- type = 2;
- break;
- //case "gc110":
- // height = 4;
- // width = 4;
- // type = 2;
- // break;
-
- //case "gc111":
- // height = 4;
- // width = 4;
- // type = 2;
- // break;
-
- case "gc119":
- height = 2.6;
- width = 2.6;
- type = 1;
- break;
- case "gc120":
- height = 5;
- width = 1;
- type = 1;
- break;
- case "gc121":
- height = 1.1;
- width = 1.1;
- type = 2;
- break;
- case "gc122":
- height = 2.1;
- width = 1.1;
- type = 2;
- break;
- case "gc123":
- height = 4.2;
- width = 2.1;
- type = 2;
- break;
- case "gc124":
- height = 3;
- width = 1.5;
- type = 1;
- break;
- case "gc125":
- height = 3.8;
- width = 1.2;
- type = 2;
- break;
- case "gc126":
- height = 2.5;
- width = 3;
- type = 2;
- break;
- case "gc143":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc144":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc145":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc160":
- height = 4.7;
- width = 4.7;
- type = 2;
- break;
- case "gc163":
- height = 0.6;
- width = 2.5;
- type = 2;
- break;
- case "gc164":
- height = 0.7;
- width = 0.7;
- type = 2;
- break;
- case "gc165":
- height = 5;
- width = 1;
- type = 2;
- break;
- case "gc170":
- height = 1.1;
- width = 1.1;
- type = 2;
- break;
- case "gc200":
- height = 1.5;
- width = 1.5;
- type = 2;
- break;
- case "gc205":
- height = 5;
- width = 2;
- type = 1;
- break;
- case "gc206":
- height = 5;
- width = 2;
- type = 1;
- break;
- case "gc207":
- height = 4;
- width = 1;
- type = 2;
- break;
- case "gc208":
- height = 1.6;
- width = 2.4;
- type = 2;
- break;
- case "gc210":
- height = 6;
- width = 2.2;
- type = 1;
- break;
- case "gc211":
- height = 3;
- width = 2.8;
- type = 3;
- break;
- case "gc212":
- height = 5;
- width = 2.6;
- type = 1;
- break;
- case "gc246":
- height = 6;
- width = 4;
- type = 1;
- break;
- case "gc251":
- height = 1;
- width = 3.5;
- type = 2;
- break;
- case "gc253":
- height = 0.7;
- width = 0.7;
- type = 2;
- break;
- case "gc254":
- height = 3;
- width = 2.5;
- type = 2;
- break;
- case "gc319":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc320":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc322":
- height = 6;
- width = 2;
- type = 1;
- break;
- case "gc323":
- height = 4;
- width = 1.1;
- type = 1;
- break;
- case "gc325":
- height = 5;
- width = 0.7;
- type = 1;
- break;
- case "gc326":
- height = 1.6;
- width = 1.6;
- type = 2;
- break;
-
- default:
- height = 2.5;
- width = 2;
- type = 2;
- break;
- }
- rebound rec = new rebound(height, width, type);
- return rec;
- }
-
- /// <summary>
- /// 指定基点与目标点移动实体
- /// </summary>
- /// <param name="ent">实体对象</param>
- /// <param name="BasePt">基点</param>
- /// <param name="TargetPt">目标点</param>
- public static void Move(Entity ent, Point3d basePt, Point3d targetPt)
- {
- Vector3d vec = targetPt - basePt;
- Matrix3d mt = Matrix3d.Displacement(vec);
- ent.TransformBy(mt);
- }
- }
- }
|