明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3470|回复: 9

[基础] 线段求和源代码(支持线段、多段线、圆、椭圆、样条曲线)

[复制链接]
发表于 2011-6-17 13:17:11 | 显示全部楼层 |阅读模式
[CommandMethod("my")]
        public void my1()
        {
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            try
            {
                using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
                {
                    BlockTable acBlkTbl;
                    acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord acBlkTblRec;
                    acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                                    OpenMode.ForWrite) as BlockTableRecord;
                    PromptSelectionOpti** pso = new PromptSelectionOpti**();
                    PromptSelectionResult psr = ed.GetSelection(pso);
                    if (psr.Status == PromptStatus.OK)
                    {
                        Selecti**et ss = psr.Value;
                        int lcount = 0;
                        int n = ss.Count;
                        double result = 0;
                        for (int i = 0; i < n; i++)
                        {
                            Entity ent = acTrans.GetObject(ss[i].ObjectId, OpenMode.ForWrite) as Entity;
                            if (ent is Line)
                            {
                                Line l = ent as Line;
                                result += l.Length;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + l.Length);
                            }
                            if (ent is Circle)
                            {
                                Circle c = ent as Circle;
                                result += c.Circumference;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + c.Circumference);
                            }
                            if (ent is Ellipse)
                            {
                                Ellipse e = ent as Ellipse;
                                double zc = Math.PI * (e.MajorRadius + e.MinorRadius);
                                result += zc;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + zc);
                            }
                            if (ent is Arc)
                            {
                                Arc arc = ent as Arc;
                                result += arc.Length;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + arc.Length);
                            }
                            if (ent is Spline)
                            {
                                Spline s = ent as Spline;
                                Curve c = s.ToPolyline();
                                Polyline pl = c as Polyline;
                                result += pl.Length;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + pl.Length);
                            }
                            if (ent is Polyline)
                            {
                                Polyline pl = ent as Polyline;
                                result += pl.Length;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + pl.Length);
                            }
                            // else
                            //{
                            //    lcount++;
                            //    ed.WriteMessage("\n实体" + lcount + "未计入总长!");
                            // }
                        }
                        ed.WriteMessage("\n线段的总长度为:{0}", result);
                    }
                    else ed.WriteMessage("\n未选中线段!"); ;
                    acTrans.Commit();
                }
            }
            catch (System.Exception)
            {
                Application.ShowAlertDialog("error");
            }
        }
发表于 2011-6-19 08:04:15 | 显示全部楼层
本帖最后由 sieben 于 2011-6-19 08:05 编辑

哦,不好意思!我的失误.

    if (ent is Curve)
      {
        Curve cur = ent as Curve;
        result += cur.GetDistanceAtParameter(cur.EndParam);
       lcount++;
        ed.WriteMessage("\n实体" + lcount + "的长度为:" + cur.GetDistanceAtParameter(cur.EndParam));
      }
回复 支持 1 反对 0

使用道具 举报

发表于 2011-6-17 14:32:41 | 显示全部楼层
      if (ent is Curve)
      {
        Curve cur = ent as Curve;
        result += cur.Length;
        lcount++;
        ed.WriteMessage("\n实体" + lcount + "的长度为:" + cur.Length);
      }
发表于 2011-6-18 13:31:12 | 显示全部楼层
很不错的例子...
 楼主| 发表于 2011-6-18 23:40:34 | 显示全部楼层
回复 sieben 的帖子

Curve类没有length属性啊?
发表于 2011-6-19 14:42:20 | 显示全部楼层
学习了~~~不错~~~
 楼主| 发表于 2011-6-20 13:35:19 | 显示全部楼层
回复 sieben 的帖子

嘿嘿,谢谢指点哦.......
发表于 2015-1-7 17:12:29 | 显示全部楼层
  if (ent is Ellipse)
                            {
                                Ellipse e = ent as Ellipse;
                                double zc = Math.PI * (e.MajorRadius + e.MinorRadius);
                                result += zc;
                                lcount++;
                                ed.WriteMessage("\n实体" + lcount + "的长度为:" + zc);
                            }

椭圆的弧长不是这样算的吧!!!!大哥
发表于 2015-1-7 17:16:42 | 显示全部楼层
  Using AcTrans As Transaction = AcCurDb.TransactionManager.StartTransaction()
            Dim EntPro As PromptEntityOptions = New PromptEntityOptions("请选择第一条圆弧")
            Dim EntRec As PromptEntityResult = AcDocEd.GetEntity(EntPro)
            If EntRec.Status <> PromptStatus.OK Then Exit Sub
            Dim OBJ As Object = AcTrans.GetObject(EntRec.ObjectId, OpenMode.ForRead)
            Dim a As Ellipse = CType(OBJ, Ellipse)        
            b = a.Spline
            MsgBox(a.GetDistAtPoint(a.EndPoint))  
        End Using
这样才是对的!
发表于 2015-1-7 17:19:50 | 显示全部楼层
如果是VB的。我坚决相信把A的类型改成Object.就可以直接通用到所有的有长度的对象了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:01 , Processed in 0.166111 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表