Ejemplo n.º 1
0
        public static void Annotate(Polyline3d acPoly3d)
        {
            //Get lable point
            Point3d labelPoint3d = acPoly3d.GetPointAtDist(acPoly3d.Length / 2);
            Point3d labelPoint   = new Point3d(labelPoint3d.X, labelPoint3d.Y, 0);

            Database acCurDb;

            acCurDb = Application.DocumentManager.MdiActiveDocument.Database;

            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                // Open the Block table for read
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;

                ObjectId blkRecId = ObjectId.Null;

                if (!acBlkTbl.Has("PipeLabel"))
                {
                    Main.LoadBlocks();
                }

                Matrix3d           curUCSMatrix = Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
                CoordinateSystem3d curUCS       = curUCSMatrix.CoordinateSystem3d;


                //calculate angle of line
                Point3d start = acPoly3d.GetPointAtDist(0);
                Point3d end   = acPoly3d.GetPointAtDist(acPoly3d.Length);

                double angle = Math.Atan((end.Y - start.Y) / (end.X - start.X));

                // Insert the block into the current space
                using (BlockReference acBlkRef = new BlockReference(labelPoint, acBlkTbl["PipeLabel"]))
                {
                    acBlkRef.TransformBy(Matrix3d.Rotation(angle, curUCS.Zaxis, labelPoint));

                    BlockTableRecord acCurSpaceBlkTblRec;
                    acCurSpaceBlkTblRec = acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;

                    acCurSpaceBlkTblRec.AppendEntity(acBlkRef);
                    acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
                }

                acTrans.Commit();
            }
        }
        public void PlineToFFL()
        {
            JPPCommandsInitialisation.JPPCommandsInitialise();

            Document acDoc   = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;

            PromptSelectionOptions pso = new PromptSelectionOptions();

            pso.SingleOnly = true;
            PromptSelectionResult psr = acDoc.Editor.GetSelection(pso);

            if (psr.Status == PromptStatus.OK)
            {
                using (Transaction tr = acCurDb.TransactionManager.StartTransaction())
                {
                    //Get all model space drawing objects
                    TypedValue[] tv = new TypedValue[1];
                    tv.SetValue(new TypedValue(67, 0), 0);
                    SelectionFilter       sf         = new SelectionFilter(tv);
                    PromptSelectionResult allObjects = acDoc.Editor.SelectAll(sf);

                    foreach (SelectedObject target in psr.Value)
                    {
                        DBObject targetobj = tr.GetObject(target.ObjectId, OpenMode.ForRead);
                        if (targetobj is BlockReference)
                        {
                            BlockReference targetReference = targetobj as BlockReference;
                            foreach (SelectedObject candidate in allObjects.Value)
                            {
                                DBObject obj = tr.GetObject(candidate.ObjectId, OpenMode.ForRead);
                                if (obj is Polyline3d)
                                {
                                    Polyline3d pline3d = obj as Polyline3d;
                                    Point3d    p3d     = pline3d.GetPointAtDist(0);
                                    if (targetReference.Position.X == p3d.X && targetReference.Position.Y == p3d.Y)
                                    {
                                        EditFFL.EditFFLValue(target.ObjectId, Math.Ceiling(p3d.Z * 20) / 20);
                                    }
                                }
                            }
                        }
                    }

                    tr.Commit();
                }
            }
        }
Ejemplo n.º 3
0
        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");
            }
        }