乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 266|回复: 11

高手写的自动裁剪程序,C#源码

[复制链接]

9

主题

66

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2019-6-5 08:32:00 | 显示全部楼层 |阅读模式
好长时间以前,在网站上看到这个源码,并下载保存了。
现在非常可惜的是网站上不去了。
现把高手写的源码放到乐筑天下,一来向有开源精神的高手致敬,二来方便有需求的朋友使用。
这段代码写的非常好,水平高,原创者的名字不记得了,再次向他致敬!
另:
很多人回帖说不能用,实际上这段源码就不是提供给大家直接使用的,如果想直接使用,可以调用自带的ExTrim命令。
这段源码是提供给大家做二次开发的基材。大家如果有自主开发自动裁剪功能的需求,则可以在这段源码的基础上开展工作。如图所示,是我做的线路带状图自动分幅软件,就是根据这段源码继续开发的,这段源码给了我很大帮助和启发。
无论如何,我还是在AutoCAD2020环境下把这个工程编译了一下,在第二个压缩文件附件的根目录下有一个mExTrim.dll文件,大家可以在AutoCAD2020下直接使用,其它版本能不能用我不知道,因为我的机器上只有这个AutoCAD版本。第二个压缩包里面的源码和第一个压缩包有一点差别,好像是原作者提供了两个版本吧。为了能在AutoCAD2020下编译执行,我对源码做了一点点修改。另一个修改的地方就是源码里面的Polyline2d线转Polyline的那个函数,原先的代码没有考虑Vertex2d类的Bulge属性,导致转换后fit过的曲线会变成折线。修改后这个问题得以解决。




udgavsajaoh.jpg

udgavsajaoh.jpg

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

9

主题

66

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2021-2-24 11:33:00 | 显示全部楼层

直接发源码了。
回复

使用道具 举报

0

主题

6

帖子

2

银币

初来乍到

Rank: 1

铜币
6
发表于 2019-6-7 21:22:00 | 显示全部楼层
路过,参考学习一下
回复

使用道具 举报

9

主题

66

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2021-2-24 11:32:00 | 显示全部楼层

        #region 公共函数
        //创建实体,把实体加入CAD数据库
        public ObjectId m_CreateEntity(Entity m_entity)
        {
            ObjectId m_objid = new ObjectId();
            if (m_entity != null)
            {
                using (Application.DocumentManager.MdiActiveDocument.LockDocument())
                {
                    using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
                    {
                        BlockTableRecord m_btr = (BlockTableRecord)m_tr.GetObject(m_db.CurrentSpaceId, OpenMode.ForWrite, false);
                        m_objid = m_btr.AppendEntity(m_entity);
                        m_tr.AddNewlyCreatedDBObject(m_entity, true);
                        m_tr.Commit();
                    }
                }
            }
            return m_objid;
        }
        //删除实体
        public void m_EraseEntity(ObjectId m_EntityId)
        {
            using (DocumentLock m_doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                if (!m_EntityId.IsNull && !m_EntityId.IsErased)
                {
                    Entity m_Ent = m_OpenEntity(m_EntityId) as Entity;
                    LayerTableRecord m_ltr = (LayerTableRecord)m_OpenEntity(m_Ent.LayerId);
                    if (!m_ltr.IsLocked)//实体不在锁定图层上
                    {
                        using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
                        {
                            try
                            {
                                Entity m_Entity = (Entity)m_tr.GetObject(m_EntityId, OpenMode.ForWrite, false);
                                if (m_Entity != null) m_Entity.Erase();
                            }
                            catch { }
                            m_tr.Commit();
                        }
                    }
                }
            }
        }
        public void m_EraseEntity(Entity m_Entity)
        {
            using (DocumentLock m_doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
                if (m_Entity != null) m_Entity.Erase();
                else m_Entity.Dispose();
            }
        }
        //打开实体
        public Object m_OpenEntity(ObjectId m_ObjId)
        {
            Object m_Obj = new Object();
            if (!m_ObjId.IsNull)
            {
                using (Transaction m_tr = m_db.TransactionManager.StartTransaction())
                {
                    m_Obj = (Object)m_tr.GetObject(m_ObjId, OpenMode.ForRead);
                    m_tr.Commit();
                }
            }
            return m_Obj;
        }
        //生成矩形
        public Autodesk.AutoCAD.DatabaseServices.Polyline m_CreateRectangle(Point3d m_Pt1, Point3d m_Pt2, bool m_bLUorLW)
        {
            if (!m_bLUorLW)//不是左上和右下点,而是左下点和右上点
            {
                Point3d m_Pt3 = m_Pt1, m_Pt4 = m_Pt2;
                m_Pt1 = new Point3d(m_Pt3.X, m_Pt4.Y, 0);
                m_Pt2 = new Point3d(m_Pt4.X, m_Pt3.Y, 0);
            }
            Autodesk.AutoCAD.DatabaseServices.Polyline m_lwpline = new Autodesk.AutoCAD.DatabaseServices.Polyline();
            m_lwpline.AddVertexAt(0, m_Pt1.Convert2d(new Plane()), 0, 0, 0);
            m_lwpline.AddVertexAt(1, new Point2d(m_Pt2.X, m_Pt1.Y), 0, 0, 0);
            m_lwpline.AddVertexAt(2, m_Pt2.Convert2d(new Plane()), 0, 0, 0);
            m_lwpline.AddVertexAt(3, new Point2d(m_Pt1.X, m_Pt2.Y), 0, 0, 0);
            m_lwpline.Closed = true;
            return m_lwpline;
        }
        //提示用户输入一点
        public bool m_GetPoint(string m_Msg, ref Point3d m_Pt, Point3d m_BasePoint, bool m_AllowNone, bool m_UseBasePoint)
        {
            if (!m_Pt.Equals(new Point3d())) m_Msg += "";
            PromptPointOptions m_ppo = new PromptPointOptions("\n" + m_Msg);
            m_ppo.AllowNone = m_AllowNone;
            m_ppo.BasePoint = m_BasePoint;
            m_ppo.UseBasePoint = m_UseBasePoint;
            PromptPointResult m_ppr = m_ed.GetPoint(m_ppo);
            if (m_ppr.Status != PromptStatus.OK)
            {
                if (m_ppr.Status == PromptStatus.None) { m_Pt = m_BasePoint; return true; }
                else return false;
            }
            m_Pt = m_ppr.Value;
            return true;
        }
        //提示选择单个实体
        public bool m_SelectEntity(string m_MSG, string m_RejectMSG, Type[] m_EntityType, ref PromptEntityResult m_PER)
        {
            PromptEntityOptions m_peo = new PromptEntityOptions((m_MSG.Substring(0, 2).Equals("\n") ? m_MSG : "\n" + m_MSG));
            m_peo.SetRejectMessage(m_RejectMSG);
            foreach (Type et in m_EntityType) m_peo.AddAllowedClass(et, false);
            m_peo.AllowNone = true;
            m_PER = m_ed.GetEntity(m_peo);
            if (m_PER.Status != PromptStatus.OK) return false;
            else return true;
        }
        //判断点pt在直线pt1->Pt2的哪一侧?返回值:1右侧;0三点共线;-1左侧
        public int m_PtSide(Point2d pt1, Point2d pt2, Point2d pt)
        {
            Vector2d m_vect1 = pt1.GetVectorTo(pt2);
            Vector2d m_vect2 = pt1.GetVectorTo(pt);
            double m_value = m_vect2.X * m_vect1.Y - m_vect1.X * m_vect2.Y;
            if (Math.Abs(m_value)  0) return 1;
            else return -1;
        }
        //求空间两曲线c1与c2在c1上的交点(带标高值)
        public Point3dCollection m_GetIntersectPoints(Curve c1, Curve c2)
        {
            Point3dCollection m_interpts = new Point3dCollection(), m_interpts1 = new Point3dCollection();
            Point3dCollection m_VertexPoints = new Point3dCollection();
            c1.IntersectWith(c2, Intersect.OnBothOperands, new Plane(), m_interpts, 0, 0);//求交点
            if (c1 is Polyline3d && !(c2 is Polyline3d))
            {
                foreach (Point3d pt in m_interpts)
                {
                    Polyline3d m_pl3d = new Polyline3d(Poly3dType.SimplePoly,
                        new Point3dCollection(new Point3d[] { pt, pt.Add(new Vector3d(0, 0, 10)) }), false);
                    Point3dCollection m_Pts = new Point3dCollection();
                    c1.IntersectWith(m_pl3d, Intersect.ExtendArgument, new Plane(), m_Pts, 0, 0);
                    foreach (Point3d pt1 in m_Pts) m_interpts1.Add(pt1);
                }
                m_interpts = m_interpts1;
            }
            //去掉不正确的交点(IntersectWith求出的交点有可能不正确!!!)
            ArrayList m_DistPtList = new ArrayList();
            foreach (Point3d pt in m_interpts)
            {
                try
                {
                    double m_Dist = c1.GetDistAtPoint(pt);//点是否在曲线上?
                    m_DistPoint3d m_DP = new m_DistPoint3d();
                    m_DP.m_dist = m_Dist;
                    m_DP.m_pt = pt;
                    m_DistPtList.Add(m_DP);
                }
                catch { }
            }
            m_DistPtList.Sort(new m_DistPtsSort());//排序
            m_interpts1 = new Point3dCollection();
            foreach (m_DistPoint3d dp in m_DistPtList) m_interpts1.Add(dp.m_pt);
            return m_interpts1;
        }
        private struct m_DistPoint3d
        {
            public double m_dist;
            public Point3d m_pt;
        }
        private class m_DistPtsSort : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                m_DistPoint3d dp1 = (m_DistPoint3d)a;
                m_DistPoint3d dp2 = (m_DistPoint3d)b;
                if (dp1.m_dist > dp2.m_dist)
                    return 1;
                if (dp1.m_dist < dp2.m_dist)
                    return -1;
                else
                    return 0;
            }
        }
        //二维多段线转换为轻量多段线
        public Autodesk.AutoCAD.DatabaseServices.Polyline m_Polyline2dToLWPolyline(ObjectId m_ObjId)
        {
            Autodesk.AutoCAD.DatabaseServices.Polyline m_pl = new Autodesk.AutoCAD.DatabaseServices.Polyline();
            Polyline2d m_pl2d = m_OpenEntity(m_ObjId) as Polyline2d;
            if (m_pl2d != null)
            {
                switch (m_pl2d.PolyType)
                {
                    case Poly2dType.FitCurvePoly:
                        m_pl.ConvertFrom(m_pl2d, false);
                        break;
                    case Poly2dType.SimplePoly:
                    case Poly2dType.CubicSplinePoly:
                    case Poly2dType.QuadSplinePoly:
                        int index = 0;
                        foreach (ObjectId vid in m_pl2d)
                        {
                            Vertex2d v2d = m_OpenEntity(vid) as Vertex2d;
                            if (v2d.VertexType != Vertex2dType.SplineControlVertex)
                                m_pl.AddVertexAt(index++, new Point2d(v2d.Position.X, v2d.Position.Y), 0, v2d.StartWidth, v2d.EndWidth);
                        }
                        m_pl.LayerId = m_pl2d.LayerId;//继承层属性
                        m_pl.Elevation = m_pl2d.Elevation;//继承高程属性
                        m_pl.LinetypeId = m_pl2d.LinetypeId;//继承线型属性
                        m_pl.ColorIndex = m_pl2d.ColorIndex;//继承颜色属性
                        break;
                    default:
                        break;
                }
            }
            return m_pl;
        }
        #endregion
    }
}
回复

使用道具 举报

14

主题

404

帖子

13

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
455
发表于 2019-6-5 10:42:00 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

18

主题

191

帖子

13

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
259
发表于 2019-6-5 18:42:00 | 显示全部楼层

向原作者致敬  希望乐筑天下坚持下去 不要502 Bad Gateway
回复

使用道具 举报

1

主题

51

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2019-6-5 22:38:00 | 显示全部楼层
看上去,高大上!小白一个,能介绍用法与安装吗?谢谢
回复

使用道具 举报

9

主题

66

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
102
发表于 2019-6-6 07:46:00 | 显示全部楼层

visual studio编译,netload加载,然后运行MExtrim命令即可。压缩包的bin文件夹下带着一个编译好的dll,但可能针对不同的AutoCAD版本,需要再重新有针对性地编译一下。
这段源码的意义不是直接运行他的命令,而是大家可以把里面的精髓部分灵活定制集成到自己的软件里面,这样才能适合各种情形,发挥更大的作用。
回复

使用道具 举报

2

主题

9

帖子

4

银币

初来乍到

Rank: 1

铜币
17
发表于 2019-6-6 15:52:00 | 显示全部楼层
多谢分享
看看
回复

使用道具 举报

1

主题

51

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2019-6-6 22:46:00 | 显示全部楼层

感谢耐心解答!!!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 02:05 , Processed in 0.258978 second(s), 89 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表