private void btn_pianchajisuan_Click(object sender, EventArgs e)
        {
            try
            {
                double   centrueL    = Convert.ToDouble(tbx_CentrelBL.Text);
                string[] soureStr    = tbx_SourceBL.Text.Trim().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                string[] targetStr   = tbx_TargetBL.Text.Trim().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                zPointXY sourcePoint = new zPointXY(Convert.ToDouble(soureStr[0].Trim()), Convert.ToDouble(soureStr[1].Trim()));
                zPointXY targetPoint = new zPointXY(Convert.ToDouble(targetStr[0].Trim()), Convert.ToDouble(targetStr[1].Trim()));

                zPointXY tmp = zjyCAD.WGS84_BLToXY(targetPoint, centrueL) - zjyCAD.WGS84_BLToXY(sourcePoint, centrueL);
                tbx_EastDelta.Text  = Math.Round(tmp.x, 3).ToString();
                tbx_NorthDelta.Text = Math.Round(tmp.y, 3).ToString();
            }
            catch
            {
            }
        }
 public TextKML(string _text, zPointXY _point)
 {
     text    = _text;
     pointXY = _point;
 }
 public void Add(zPointXY pointxy)
 {
     pointList.Add(pointxy);
 }
        private void btn_outputCAD_Click(object sender, EventArgs e)
        {
            Editor        ed          = cadSer.Application.DocumentManager.MdiActiveDocument.Editor;
            string        MKLDirctory = tbx_KMLPath.Text.Trim();
            List <string> ContentList = new List <string>();

            string[] AllFiles = Directory.GetFiles(MKLDirctory);

            Dictionary <string, List <zPointXY> > PointsDic = new Dictionary <string, List <zPointXY> >();

            List <KeyValuePair <string, zPointXY> > pointInfo = new List <KeyValuePair <string, zPointXY> >();

            foreach (string tmp in AllFiles)
            {
                if (tmp.Contains(".kml"))
                {
                    string keyDic = Path.GetFileNameWithoutExtension(tmp);

                    string[] allLines = File.ReadAllLines(tmp);
                    int      nline    = 0;
                    for (int linestringIndex = 0; linestringIndex < allLines.Length; linestringIndex++)
                    {
                        string tmpstr = keyDic;
                        //默认<LineString><Point>为单独一行
                        if (allLines[linestringIndex].Contains("<LineString>"))
                        {
                            List <zPointXY> pointList = new List <zPointXY>();
                            ++nline;
                            while (true)
                            {
                                linestringIndex++;

                                //   if (linestringIndex >= allLines.Length) break;

                                if (allLines[linestringIndex].Contains("<coordinates>") && allLines[linestringIndex].Contains("</coordinates>"))
                                {
                                    string   tmpstr_1 = allLines[linestringIndex].Trim();
                                    string[] abctmp   = tmpstr_1.Split(new char[] { '>', '<' }, StringSplitOptions.RemoveEmptyEntries);
                                    string   useStr   = abctmp[1];

                                    string[] multiCoord = allLines[linestringIndex].Trim().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                                    foreach (string single in multiCoord)
                                    {
                                        string[] points = single.Trim().Split(',');
                                        zPointXY point  = new zPointXY(Convert.ToDouble(points[0]), Convert.ToDouble(points[1]));
                                        pointList.Add(point);
                                    }

                                    if (keyDic.Contains("反"))
                                    {
                                        pointList.Reverse();
                                    }

                                    tmpstr = keyDic + "_" + nline.ToString();
                                    PointsDic.Add(tmpstr, pointList);

                                    break;
                                }

                                if (allLines[linestringIndex].Contains("<coordinates>"))
                                {
                                    while (true)
                                    {
                                        linestringIndex++;

                                        if (allLines[linestringIndex].Contains("</coordinates>"))
                                        {
                                            if (keyDic.Contains("反"))
                                            {
                                                pointList.Reverse();
                                            }

                                            tmpstr = keyDic + "_" + nline.ToString();
                                            PointsDic.Add(tmpstr, pointList);


                                            break;
                                        }


                                        string[] multiCoord = allLines[linestringIndex].Trim().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                                        foreach (string single in multiCoord)
                                        {
                                            string[] points = single.Trim().Split(',');
                                            zPointXY point  = new zPointXY(Convert.ToDouble(points[0]), Convert.ToDouble(points[1]));
                                            pointList.Add(point);
                                        }
                                    }
                                }

                                if (allLines[linestringIndex].Contains("</LineString>"))
                                {
                                    break;
                                }
                            }
                        }


                        int pointposition = 0;
                        if (allLines[linestringIndex].Contains("<Point>"))
                        {
                            pointposition = linestringIndex;

                            zPointXY pointXY   = new zPointXY();
                            string   pointName = "";
                            //获取点坐标
                            while (true)
                            {
                                linestringIndex++;
                                if (allLines[linestringIndex].Contains("<coordinates>") && allLines[linestringIndex].Contains("</coordinates>"))
                                {
                                    string   tmpstr_1 = allLines[linestringIndex].Trim();
                                    string[] abctmp   = tmpstr_1.Split(new char[] { '>', '<' }, StringSplitOptions.RemoveEmptyEntries);
                                    string   useStr   = abctmp[1];
                                    string[] points   = useStr.Trim().Split(',');
                                    pointXY = new zPointXY(Convert.ToDouble(points[0]), Convert.ToDouble(points[1]));
                                    break;
                                }
                                if (allLines[linestringIndex].Contains("<coordinates>"))
                                {
                                    while (true)
                                    {
                                        linestringIndex++;

                                        if (allLines[linestringIndex].Contains("</coordinates>"))
                                        {
                                            break;
                                        }

                                        if (allLines[linestringIndex] == "")
                                        {
                                            continue;
                                        }


                                        string[] points = allLines[linestringIndex].Trim().Split(',');
                                        pointXY = new zPointXY(Convert.ToDouble(points[0]), Convert.ToDouble(points[1]));
                                    }
                                    break;
                                }
                                if (allLines[linestringIndex].Contains("</Point>"))
                                {
                                    break;
                                }
                            }
                            //获取点名称
                            while (true)
                            {
                                pointposition--;
                                if (allLines[pointposition].Contains("<Placemark>"))
                                {
                                    break;
                                }
                                if (allLines[pointposition].Contains("<name>") && allLines[pointposition].Contains("</name>"))
                                {
                                    string   tmpstr_1 = allLines[pointposition].Trim();
                                    string[] abctmp   = tmpstr_1.Split(new char[] { '>', '<' }, StringSplitOptions.RemoveEmptyEntries);
                                    pointName = abctmp[1];

                                    break;
                                }
                            }

                            pointInfo.Add(new KeyValuePair <string, zPointXY>(pointName, pointXY));
                        }
                    }
                }
            }

            ed.WriteMessage("读取完成\n");


            double centerLongitude = Convert.ToDouble(tbx_CentrelBL.Text.Trim());


            int ii = 1;

            foreach (var tmp in PointsDic)
            {
                ed.WriteMessage("绘制polyline\n");



                zjyCAD.zPolylineCreate(zjyCAD.WGS84_BLToXY(tmp.Value, centerLongitude));


                zjyCAD.zCreatMtext(Path.GetFileName(tmp.Key), zjyCAD.WGS84_BLToXY(tmp.Value[0], centerLongitude), 50, 800, "zjy_kml_file");
            }
            foreach (var tmp in pointInfo)
            {
                zjyCAD.zCreatMtext(Path.GetFileName(tmp.Key), zjyCAD.WGS84_BLToXY(tmp.Value, centerLongitude), 50, 800, "zjy_point_label");
            }
        }
        private void btn_CADtoKML_Click(object sender, EventArgs e)
        {
            Editor ed = cadSer.Application.DocumentManager.MdiActiveDocument.Editor;
            //两直线合并误差
            double error_len = Convert.ToDouble(tbx_minLineSegmentLength.Text.Trim());


            try
            {
                double centerLongitude = Convert.ToDouble(tbx_CentrelBL.Text.Trim());
                bool   is80            = cbx_Is80.Checked;

                double estDelta   = Convert.ToDouble(tbx_EastDelta.Text);
                double northDelta = Convert.ToDouble(tbx_NorthDelta.Text);


                Database db     = HostApplicationServices.WorkingDatabase;
                var      middoc = cadSer.Application.DocumentManager.MdiActiveDocument;

                List <LineStringKML> lineListKML = new List <LineStringKML>();
                List <TextKML>       textListKML = new List <TextKML>();


                ObjectId[] objectIdsArr = ed.GetSelection().Value.GetObjectIds();
                ed.WriteMessage("==================================================\n");
                // ed.WriteMessage(objectIds.Count.ToString() + "\n");
                var      doc_lock = middoc.LockDocument();
                DBObject dbo;

                //提取polyline line spline circel arc ellipse polyline3d mtext dbtext
                foreach (ObjectId tempObjectId in objectIdsArr)
                {
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                        dbo = trans.GetObject(tempObjectId, OpenMode.ForRead);
                        #region 所有类型
                        //if (dbo.GetType().Equals(typeof(Polyline)) || dbo.GetType().Equals(typeof(Line)) || dbo.GetType().Equals(typeof(Spline)) || dbo.GetType().Equals(typeof(Circle)) || dbo.GetType().Equals(typeof(Arc)) || dbo.GetType().Equals(typeof(Ellipse)) || dbo.GetType().Equals(typeof(Polyline3d)))
                        //{
                        //    Curve dbo_bR = (Curve)dbo;

                        //    double length = dbo_bR.GetDistanceAtParameter(dbo_bR.EndParam);
                        //    LineStringKML lineStringKML = new LineStringKML();

                        //    for (double i = 0; i <length; i+=error_len)
                        //    {
                        //        Point3d tmpPoint = dbo_bR.GetPointAtDist(i);

                        //        lineStringKML.Add(new zPointXY(tmpPoint.X, tmpPoint.Y));
                        //    }


                        //       Point3d tmpPoint_1 = dbo_bR.GetPointAtParameter(dbo_bR.EndParam);

                        //        lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));



                        //    lineListKML.Add(lineStringKML);
                        //}
                        #endregion
                        if (dbo.GetType().Equals(typeof(Line)))
                        {
                            Curve dbo_bR = (Curve)dbo;


                            LineStringKML lineStringKML = new LineStringKML();
                            Point3d       tmpPoint_0    = dbo_bR.StartPoint;

                            lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));


                            Point3d tmpPoint_1 = dbo_bR.EndPoint;

                            lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));

                            lineListKML.Add(lineStringKML);
                        }

                        if (dbo.GetType().Equals(typeof(Polyline)))
                        {
                            Polyline      dbo_bR        = (Polyline)dbo;
                            LineStringKML lineStringKML = new LineStringKML();
                            // foreach(var tmp in dbo_bR.para)
                            double length = dbo_bR.GetDistanceAtParameter(dbo_bR.EndParam);


                            for (int i = 0; i < dbo_bR.EndParam; i++)
                            {
                                // Point3d tmpPoint = dbo_bR.GetPointAtParameter(i);

                                if (dbo_bR.GetSegmentType(i) == SegmentType.Line)
                                {
                                    Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(i);
                                    lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                                }
                                else if (dbo_bR.GetSegmentType(i) == SegmentType.Arc)
                                {
                                    for (double isegment = i; isegment < i + 1; isegment += 0.05)
                                    {
                                        Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(isegment);
                                        lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                                    }
                                }
                            }

                            Point3d tmpPoint_1 = dbo_bR.GetPointAtParameter(dbo_bR.EndParam);

                            lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));

                            if (dbo_bR.Closed)
                            {
                                Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(dbo_bR.StartParam);
                                lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                            }


                            lineListKML.Add(lineStringKML);
                        }

                        if (dbo.GetType().Equals(typeof(Circle)) || dbo.GetType().Equals(typeof(Arc)) || dbo.GetType().Equals(typeof(Ellipse)))
                        {
                            Curve dbo_bR = (Curve)dbo;

                            double        length        = dbo_bR.GetDistanceAtParameter(dbo_bR.EndParam);
                            LineStringKML lineStringKML = new LineStringKML();

                            for (double i = dbo_bR.StartParam; i < dbo_bR.EndParam; i += (dbo_bR.EndParam - dbo_bR.StartParam) / 20.0)
                            {
                                Point3d tmpPoint = dbo_bR.GetPointAtParameter(i);

                                lineStringKML.Add(new zPointXY(tmpPoint.X, tmpPoint.Y));
                            }


                            Point3d tmpPoint_1 = dbo_bR.GetPointAtParameter(dbo_bR.EndParam);

                            lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));

                            if (dbo_bR.Closed)
                            {
                                Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(dbo_bR.StartParam);
                                lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                            }

                            lineListKML.Add(lineStringKML);
                        }


                        if (dbo.GetType().Equals(typeof(Polyline3d)))
                        {
                            Polyline3d    dbo_bR        = (Polyline3d)dbo;
                            LineStringKML lineStringKML = new LineStringKML();
                            if (dbo_bR.PolyType == Poly3dType.SimplePoly)
                            {
                                for (int i = 0; i < dbo_bR.EndParam; i++)
                                {
                                    Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(i);
                                    lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                                }
                            }
                            else
                            {
                                double length = dbo_bR.GetDistanceAtParameter(dbo_bR.EndParam);
                                for (double i = 0; i < length; i += error_len)
                                {
                                    Point3d tmpPoint = dbo_bR.GetPointAtDist(i);

                                    lineStringKML.Add(new zPointXY(tmpPoint.X, tmpPoint.Y));
                                }
                            }
                            Point3d tmpPoint_1 = dbo_bR.GetPointAtParameter(dbo_bR.EndParam);

                            lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));

                            if (dbo_bR.Closed)
                            {
                                Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(dbo_bR.StartParam);
                                lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                            }
                            lineListKML.Add(lineStringKML);
                        }


                        if (dbo.GetType().Equals(typeof(Spline)))
                        {
                            Spline dbo_bR = (Spline)dbo;


                            double        length        = dbo_bR.GetDistanceAtParameter(dbo_bR.EndParam);
                            LineStringKML lineStringKML = new LineStringKML();

                            for (double i = 0; i < length; i += error_len)
                            {
                                Point3d tmpPoint = dbo_bR.GetPointAtDist(i);

                                lineStringKML.Add(new zPointXY(tmpPoint.X, tmpPoint.Y));
                            }


                            Point3d tmpPoint_1 = dbo_bR.GetPointAtParameter(dbo_bR.EndParam);

                            lineStringKML.Add(new zPointXY(tmpPoint_1.X, tmpPoint_1.Y));

                            if (dbo_bR.Closed)
                            {
                                Point3d tmpPoint_0 = dbo_bR.GetPointAtParameter(dbo_bR.StartParam);
                                lineStringKML.Add(new zPointXY(tmpPoint_0.X, tmpPoint_0.Y));
                            }
                            lineListKML.Add(lineStringKML);
                        }

                        if (dbo.GetType().Equals(typeof(DBText)))
                        {
                            DBText dbtext = (DBText)dbo;
                            // string name = dbtext.TextString;
                            // Point3d point3D = dbtext.Position;
                            TextKML tmpkml = new TextKML(dbtext.TextString, new zPointXY(dbtext.Position.X, dbtext.Position.Y));
                            textListKML.Add(tmpkml);
                        }
                        if (dbo.GetType().Equals(typeof(MText)))
                        {
                            MText dbtext = (MText)dbo;
                            // string name = dbtext.Text;
                            //Point3d point3D = dbtext.Location;
                            TextKML tmpkml = new TextKML(dbtext.Text.Replace('\r', ' '), new zPointXY(dbtext.Location.X, dbtext.Location.Y));
                            textListKML.Add(tmpkml);
                        }

                        trans.Commit();
                    }
                }

                doc_lock.Dispose();

                ed.WriteMessage("===============读取完成=======================\n");

                //foreach(var tmp in  lineListKML )
                //{
                //    zjyCAD.zPolylineCreate(tmp.pointList,"zjy_assiaaaaaaaaaaaa");
                //}

                //foreach(var tmp in textListKML)
                //{
                //    zjyCAD.zCreatText(tmp.text, tmp.pointXY, 10, 0.8, "zjy_assiaaaaaaaaaaaa");
                //}

                string        pmPath  = tbx_SaveKMLPath.Text.Trim();
                List <string> xmlhead = new List <string>()
                {
                    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
                    //  "<kml xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\" xmlns:kml=\"http://www.opengis.net/kml/2.2\" xmlns:atom=\"http://www.w3.org/2005/Atom\">",
                    " <kml xmlns=\"http://earth.google.com/kml/2.1\">",
                    "<Document>",
                    "<name>zjy</name>",
                    // "<open>1</open>",
                    // "<description>zjy生成</description>",
                    "<Style id=\"yellowLineGreenPoly\" >",
                    "   <LineStyle>",
                    "       <color>ff000000</color>",
                    "       <width>4</width>",
                    "   </LineStyle>",
                    "   </Style>",
                    "<Folder>",
                    "<name>zjy</name>",
                    "       <visibility>1</visibility>",
                };

                List <string> xmlend = new List <string>()
                {
                    "</Folder>",
                    "</Document>",
                    "</kml>"
                };
                //生成kml文件
                List <string> kmlFile = new List <string>();
                kmlFile.AddRange(xmlhead);

                //生成路线信息图像


                foreach (var tmp in lineListKML)
                {
                    List <string> roadList = new List <string>()
                    {
                        "   <Placemark>",
                        "       <styleUrl>#yellowLineGreenPoly</styleUrl>",
                        "       <LineString>",
                        "       <tessellate>1</tessellate>",
                        "       <coordinates>"
                    };
                    foreach (zPointXY linePoint in tmp.pointList)
                    {
                        zPointXY xy = linePoint;
                        if (is80)
                        {
                            xy = linePoint + new zPointXY(estDelta, northDelta);
                        }

                        zPointXY tmp_BL = zjyCAD.WGS84_XYToBL(xy, centerLongitude);

                        roadList.Add("      " + tmp_BL.y.ToString() + "," + tmp_BL.x.ToString() + ",0.0000");
                    }
                    roadList.Add("      </coordinates>");
                    roadList.Add("      </LineString>");
                    roadList.Add("  </Placemark>");
                    kmlFile.AddRange(roadList);
                }



                //生成标签信息
                List <string> roadBQList = new List <string>();
                foreach (var tmp in textListKML)
                {
                    zPointXY xy = tmp.pointXY;
                    if (is80)
                    {
                        xy = tmp.pointXY + new zPointXY(estDelta, northDelta);
                    }


                    zPointXY tmp_BL = zjyCAD.WGS84_XYToBL(xy, centerLongitude);
                    roadBQList.Add("    <Placemark>");
                    roadBQList.Add("        <name>" + tmp.text + "</name>");
                    roadBQList.Add("        <Point>");
                    roadBQList.Add("        <coordinates>" + tmp_BL.y.ToString() + "," + tmp_BL.x.ToString() + ",0.0000" + "</coordinates>");
                    roadBQList.Add("        </Point>");
                    // roadBQList.Add("        <markerStyle>-2</markerStyle>");
                    roadBQList.Add("     </Placemark>");
                }
                kmlFile.AddRange(roadBQList);



                kmlFile.AddRange(xmlend);
                if (!Directory.Exists(pmPath))
                {
                    Directory.CreateDirectory(pmPath);
                }

                File.WriteAllLines(pmPath + "/" + tbx_KMLfileName.Text.Trim(), kmlFile.ToArray());
            }

            catch
            {
                ed.WriteMessage("出错\n");
            }
        }