using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using GrxCAD.ApplicationServices; using GrxCAD.DatabaseServices; using GrxCAD.EditorInput; using GrxCAD.Geometry; using System.Windows.Forms; using System.IO; namespace HCTools { class PickupPoint { public void PickupPt(string num) { Document document = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = HostApplicationServices.WorkingDatabase; Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; TypedValue[] value = new TypedValue[] { new TypedValue((int)DxfCode.Start,"LWPOLYLINE,POLYLINE") };//设置筛选条件 SelectionFilter filter = new SelectionFilter(value); //选择区域中全部对象 //PromptSelectionResult psr = ed.SelectAll(filter); // 要求在图形区域中手动选择对象 PromptSelectionResult psr = ed.GetSelection(filter); SelectionSet selectionset = psr.Value; if (psr.Status == PromptStatus.OK) { ObjectId[] obj = new ObjectId[selectionset.Count]; obj = selectionset.GetObjectIds(); List AllPoints = new List(); List FinalPoints = new List(); string decimalnum = "F" + num; string ele = " "; for (int i = 0; i < obj.Length; i++) { DocumentLock documentlock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); using (Transaction trans = db.TransactionManager.StartTransaction()) { Point3dCollection coll = new Point3dCollection(); ObjectId objid = obj[i]; Entity entity = (Entity)trans.GetObject(objid, OpenMode.ForWrite); if (entity is Polyline) { Polyline line = entity as Polyline; //line.GetStretchPoints(coll); int vertexNum = line.NumberOfVertices; Point3d point; // 遍历获取多段线顶点坐标 for (int ii = 0; ii < vertexNum; ii++) { point = line.GetPoint3dAt(ii); coll.Add(point); } ele = line.Elevation.ToString(); } else if (entity is Polyline2d) { Polyline2d line = entity as Polyline2d; //line.GetStretchPoints(coll); foreach (ObjectId id in line) { Vertex2d vx = (Vertex2d)trans.GetObject(id, OpenMode.ForRead); if (vx.VertexType != Vertex2dType.SplineControlVertex) { coll.Add(vx.Position); } } ele = line.Elevation.ToString(); } else if(entity is Polyline3d) { Polyline3d line = entity as Polyline3d; foreach (ObjectId id in line) { PolylineVertex3d vx3d = (PolylineVertex3d)trans.GetObject(id, OpenMode.ForRead); coll.Add(vx3d.Position); } ele = "三维多段线"; } #region//无用 ////检查选择的多段线是否有重复点,如果有就移除 //for (int ii = 0; ii < coll.Count - 1; ii++) //{ // for (int iii = ii + 1; iii < ii + 21; iii++) // { // if (iii == coll.Count + 1) // break; // string x1 = coll[ii].X.ToString(decimalnum); // string y1 = coll[ii].Y.ToString(decimalnum); // string x2 = coll[iii].X.ToString(decimalnum); // string y2 = coll[iii].Y.ToString(decimalnum); // if (x1 == x2 && y1 == y2) // { // coll.RemoveAt(iii); // } // else // { // continue; // } // } //} #endregion for (int j = 0; j < coll.Count; j++) { AllPoints.Add(coll[j]); } trans.Commit(); } documentlock.Dispose(); for (int ii = 0; ii < AllPoints.Count; ii++) { if (ii == 0) FinalPoints.Add(ele); string x = AllPoints[ii].X.ToString(decimalnum); string y = AllPoints[ii].Y.ToString(decimalnum); string z = AllPoints[ii].Z.ToString(decimalnum); string res = string.Join(" ", new string[] { x, y, z }); FinalPoints.Add(res); } AllPoints.Clear(); } //保存文件对话框 System.Windows.Forms.SaveFileDialog save = new System.Windows.Forms.SaveFileDialog(); save.Filter = "文本文件(*.txt)|*.txt"; //FolderBrowserDialog dialog = new FolderBrowserDialog(); //dialog.Description = "请选择文件路径"; //保存文件是否记录上一次文件目录 save.RestoreDirectory = true; if (save.ShowDialog() == DialogResult.OK) { string savePath = save.FileName; File.WriteAllLines(savePath, FinalPoints, Encoding.UTF8); ed.WriteMessage("保存成功\n"); } else { MessageBox.Show("保存失败\n"); } //if (dialog.ShowDialog() == DialogResult.OK) //{ // string foldPath = dialog.SelectedPath; // string savePath = foldPath + "\\" + ele + ".txt"; // File.WriteAllLines(savePath, FinalPoints, Encoding.UTF8); // ed.WriteMessage("\n保存成功"); //} } else { ed.WriteMessage("\n多段线选择失败"); } } } }