实体定位 autoCAD 二次开发

对于cad二次开发的程序员来说,定位功能可谓是常用操作。下面介绍一种定位方式。

 

  /// <summary>
        /// 定位
        /// </summary>
        /// <param name="oid"></param>
        public void Orientate(ObjectId[] oid)
        {
            ObjectIdCollection oic = new ObjectIdCollection();
            // 定义最大点
            double locationMaxX = -100000000000000;
            double locationMaxy = -100000000000000;
            double locationMaxZ = -100000000000000;
            double locationMinX = 100000000000000;
            double locationMinY = 100000000000000;
            double locationMinZ = 100000000000000;

            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Database db = HostApplicationServices.WorkingDatabase;
            using (DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                //定义过滤器

                PromptSelectionResult res = ed.SelectAll();
                if (res.Status == PromptStatus.OK)
                {
                    using (Transaction trans = db.TransactionManager.StartTransaction())
                    {
                        //遍历选择集
                        foreach (ObjectId id in res.Value.GetObjectIds())
                        {
                            if (id == oid)
                            {
                                oic.Add(oid);
                                //获取选择集里的对象
                                Entity entObject = trans.GetObject(id, OpenMode.ForWrite) as Entity;
                             
                                // 定义最大点X
                                double maxX = 0;
                                // 定义最大点Y
                                double maxY = 0;
                                // 定义最大点Z
                                double maxZ = 0;
                                // 定义最小点X
                                double minX = 0;
                                // 定义最小点Y
                                double minY = 0;
                                // 定义最小点Z
                                double minZ = 0;
                                // 得到最大点X
                                maxX = entObject.GeometricExtents.MaxPoint.X;
                                // 得到最大点Y
                                maxY = entObject.GeometricExtents.MaxPoint.Y;
                                // 得到最大点Z
                                maxZ = entObject.GeometricExtents.MaxPoint.Z;
                                // 得到最小点X
                                minX = entObject.GeometricExtents.MinPoint.X;
                                // 得到最小点Y
                                minY = entObject.GeometricExtents.MinPoint.Y;
                                // 得到最小点Z
                                minZ = entObject.GeometricExtents.MinPoint.Z;
                                // 得到最大点x
                                if (maxX > locationMaxX)
                                {
                                    // 得到最大点x
                                    locationMaxX = maxX;
                                }
                                // 得到最大点y
                                if (maxY > locationMaxy)
                                {
                                    // 得到最大点y
                                    locationMaxy = maxY;
                                }
                                // 得到最大点z
                                if (maxZ > locationMaxZ)
                                {
                                    // 得到最大点Z
                                    locationMaxZ = maxZ;
                                }
                                // 得到最小点x
                                if (minX < locationMinX)
                                {
                                    // 得到最小点x
                                    locationMinX = minX;
                                }
                                // 得到最小点y
                                if (minY < locationMinY)
                                {
                                    // 得到最小点y
                                    locationMinY = minY;
                                }
                                // 得到最小点z
                                if (minZ < locationMinZ)
                                {
                                    // 得到最小点z
                                    locationMinZ = minZ;
                                }

                                // 计算中心点
                                double x = (locationMaxX + locationMinX) / 2;
                                double y = (locationMaxy + locationMinY) / 2;
                                double z = (locationMaxZ + locationMinZ) / 2;
                                // 定位的中心点
                                Point3d center = new Point3d();
                                // 得到中心点
                                center = new Point3d(x, y, z);
                                // 长度
                                double length = (locationMaxX - locationMinX);
                                // 宽度
                                double weight = (locationMaxy - locationMinY);
                                // 定位
                                VPoint(center, length + 150, weight + 150);

                        


                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        trans.Commit();
                    }
                }
            }
        }
        #endregion
该方法的实现步骤是,通过过滤器选择实体id进行匹配。如果匹配成功,则进行中心点计算。之后通过中心点和长宽。即可将被定位的实体以合适的视角展示到视图中(俯视)。读者也可以调用前面的其他设置视图方法,得到不同视角的定位视图效果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值