Example #1
0
        /// <summary>
        /// Перемещение объектов
        /// Открытая транзакция не требуется
        /// При отмене пользователем - объекты удаляются
        /// </summary>
        /// <param name="ed"></param>
        /// <param name="ids"></param>
        /// <param name="pt"></param>
        /// <returns></returns>
        public static bool Drag(this Editor ed, ObjectId[] ids, Point3d pt)
        {
            if (ids == null || !ids.Any()) return false;
            SelectionSet selSet = SelectionSet.FromObjectIds(ids);
            PromptPointResult ppr = ed.Drag(selSet, "\nТочка вставки:", (Point3d ptInput, ref Matrix3d mat) =>
            {
                if (ptInput.IsEqualTo(pt)) return SamplerStatus.NoChange;
                mat = Matrix3d.Displacement(pt.GetVectorTo(ptInput));
                //pt = ptInput;
                return SamplerStatus.OK;
            });

            if (ppr.Status == PromptStatus.OK)
            {
                using (var t = ed.Document.TransactionManager.StartTransaction())
                {
                    foreach (var item in ids)
                    {
                        var mat = Matrix3d.Displacement(pt.GetVectorTo(ppr.Value));
                        var ent = item.GetObject(OpenMode.ForWrite, false, true) as Entity;
                        ent.TransformBy(mat);
                    }
                    t.Commit();
                }

                return true;
            }
            else
            {
                using (var t = ed.Document.TransactionManager.StartTransaction())
                {
                    foreach (var id in ids)
                    {
                        var ent = id.GetObject(OpenMode.ForWrite);
                        ent.Erase();
                    }
                    t.Commit();
                }
                return false;
            }
        }
Example #2
0
        public static void SelectHoleToRemoveArea()
        {
            var      holeIds  = new ObjectId[0];
            ObjectId parcelId = ObjectId.Null;
            Document document = Application.DocumentManager.MdiActiveDocument;

            document.Editor.WriteMessage("\n选择需要扣除面积的孔洞: ");
            var result = StartSelectPolyline(false);

            if (result.Status != PromptStatus.OK)
            {
                return;
            }

            // 洞
            if (result.Value.Count >= 1)
            {
                holeIds = result.Value.GetObjectIds();
            }

            // 检查地块是否封闭
            using (var tr = document.Database.TransactionManager.StartTransaction())
            {
                foreach (var objectId in holeIds)
                {
                    var curve = tr.GetObject(objectId, OpenMode.ForRead) as Curve;
                    if (curve != null && !curve.Closed)
                    {
                        document.Editor.WriteMessage("\n错误:选择的孔洞不封闭");
                        return;
                    }
                }
            }

            // 外边界
            Point3d pickedPoint;

            if (!SelectPolylineEntity("\n选择要扣除面积的地块界线: ", "\n实体错误", out parcelId, out pickedPoint) ||
                parcelId == ObjectId.Null)
            {
                return;
            }

            // 检查地块是否封闭
            using (var tr = document.Database.TransactionManager.StartTransaction())
            {
                var curve = tr.GetObject(parcelId, OpenMode.ForRead) as Curve;
                if (curve != null && !curve.Closed)
                {
                    document.Editor.WriteMessage("\n错误:选择的地块界线不封闭");
                    return;
                }
            }

            // 如果地块是合适的
            if (parcelId.IsValid && holeIds.Any())
            {
                foreach (var objectId in holeIds)
                {
                    if (objectId == parcelId)
                    {
                        document.Editor.WriteMessage("\n错误:句柄为{0}的孔洞与地块边界相同", objectId.Handle);
                        return;
                    }

                    if (!WithIn(objectId, parcelId))
                    {
                        document.Editor.WriteMessage("\n错误:句柄为{0}的孔洞不在地块边界内部", objectId.Handle);
                        return;
                    }
                }

                // 新增孔洞到地块
                var parcel = new ParcelPolygon(parcelId);
                parcel.AddHoleIds(holeIds);
                document.Editor.WriteMessage("\n将{0}个多边形设定为扣除面积的孔洞", holeIds.Count());
            }
        }