zoukankan      html  css  js  c++  java
  • 程序实现曲面切割

    下面这段代码来自一个客户,实现用一个曲面切割另外一个,比如用一块铁板把一个两头有盖的汽油桶切成两个开口的桶。原理很简单,就是利用了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();
                    
                }
                
            }

  • 相关阅读:
    最小覆盖圆算法
    hdu2202(最大三角形 )凸包
    hdu1392(凸包)
    hdu1348
    凸包模板
    凸包算法
    DataTable和List互转
    没有功能需求设计文档?对不起,拒绝开发!【分享】
    [分享]浅谈分布式数据库
    微信公众号授权,支付,退款总结【shoucang】
  • 原文地址:https://www.cnblogs.com/junqilian/p/3115932.html
Copyright © 2011-2022 走看看