• 程序实现曲面切割


    下面这段代码来自一个客户,实现用一个曲面切割另外一个,比如用一块铁板把一个两头有盖的汽油桶切成两个开口的桶。原理很简单,就是利用了AcDbSurface的SliceBySurface方法:

    切割前:

    image

    切割后,为了看得清楚,把无盖桶移动了一下:

    image

    代码:

            [CommandMethod("TestSliceSurface")]
            public void TestSliceSurface()
            {
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                var ed = doc.Editor;
    
                using (DocumentLock docLock = doc.LockDocument())
                {
                    Database db = doc.Database;
                    using (Transaction ts = db.TransactionManager.StartTransaction())
                    {
                        BlockTableRecord btr = ts.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                        var peo1 = new PromptEntityOptions("\nSelect first surface");
                        peo1.SetRejectMessage("\nMust be a surface.");
                        peo1.AddAllowedClass(typeof(AcDb.Surface), false);
    
                        var per1 = ed.GetEntity(peo1);
                        if (per1.Status != PromptStatus.OK)
                            return;
    
                        var obj1 = ts.GetObject(per1.ObjectId, OpenMode.ForWrite);
                        var surf1 = obj1 as AcDb.Surface;
                        if (surf1 == null)
                        {
    
                            ed.WriteMessage("\nFirst object must be a surface.");
                            return;
                        }
                        
                        var peo2 = new PromptEntityOptions("\nSelect second surface");
                        peo2.SetRejectMessage("\nMust be a surface.");
                        peo2.AddAllowedClass(typeof(AcDb.Surface), false);
    
                        var per2 = ed.GetEntity(peo2);
                        if (per2.Status != PromptStatus.OK)
                            return;
    
                        var obj2 = ts.GetObject(per2.ObjectId, OpenMode.ForWrite);
                        var surf2 = obj2 as AcDb.Surface;
                        if (surf2 == null)
                        {
    
                            ed.WriteMessage("\nSecond object must be a surface.");
                            return;
                        }
    
                        SurfaceSliceResults ss = surf1.SliceBySurface(surf2);
    
                        btr.AppendEntity(ss.NegativeHalfSurface);
                        ts.AddNewlyCreatedDBObject(ss.NegativeHalfSurface, true);
    
                        ts.Commit();
                        ts.Dispose();
    
                    }
                    docLock.Dispose();
                    
                }
                
            }

  • 相关阅读:
    Two Sum II
    Read N Characters Given Read4
    Binary Tree Upside Down
    2015半年记
    再写一帖~就《离开上海》一文再说明
    再见,上海~非主流码农在上海的9年心路历程
    Debug就是Debug,Release就是Release
    代码修改之后MSbuild编译不出最新的dll解决方法
    回顾会议议程
    搞好团队建设的致胜法宝
  • 原文地址:https://www.cnblogs.com/junqilian/p/3115932.html
Copyright © 2020-2023  润新知