程序实现曲面切割

简介:


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

作者: 峻祁连
邮箱:junqilian@163.com 
出处: http://junqilian.cnblogs.com 
转载请保留此信息。




本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2013/06/03/3115932.html ,如需转载请自行联系原作者
目录
打赏
0
0
0
0
23
分享
相关文章
[再寄小读者之数学篇](2014-10-27 两曲面围成的区域的体积与表面积)
(from M.J. Shu) 设立体 \vSax2+y2=2zz=4x2+y2 围成, 求 \vSa 的体积与表面积.   解答: 该区域由旋转抛物面与圆锥面围成.
689 0
(十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.背景 在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工具盒面积测量工具。
916 0
动态规划之钢条切割问题:自低向上(Python实现)
动态规划之钢条切割问题:自低向上(Python实现)
57 0
小程序实现全屏幕高斯模糊背景图
小程序实现全屏幕高斯模糊背景图
220 0
第十五章 动态规划——钢条切割
前言:动态规划的概念   动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解。
1101 0
Halcon标定系列(5):4点标定之眼在手外项目实践,已知仿射变换矩阵,计算得到旋转角度和缩放因子等参数
Halcon标定系列(5):4点标定之眼在手外项目实践,已知仿射变换矩阵,计算得到旋转角度和缩放因子等参数
1065 0
Halcon标定系列(5):4点标定之眼在手外项目实践,已知仿射变换矩阵,计算得到旋转角度和缩放因子等参数