zoukankan      html  css  js  c++  java
  • 查询给定区域内曲面平均高程

    2019年5月23日QQ群友聊天,

    谈到如何查询曲面某范围内的平均高程,

    对于整个曲面的平均高程,

    在曲面特性内可以直接查看,

    对于给定范围内的平均高程怎没有现成的命令可以实现,

    虽然可以创建剪裁曲面,

    创建新曲面后进行查看,

    但对于多个范围的话,

    重复操作也就很烦人了。

    所以就又一次体现出学习一点点二次开发知识的必要性了!

    曲面有现成的API可以查询给定范围的界内体积,

    体积除以底面积,

    就应该是平均高程!

    就这么简单,

    大致估计一下代码的行数,

    应该不超过100行。

    刚好电脑在手边,

    那就试着写一下吧,

    说不准这个功能那天自己也能用上。

    代码如下:

     1 using Autodesk.AutoCAD.DatabaseServices;
     2 using Autodesk.AutoCAD.EditorInput;
     3 using Autodesk.AutoCAD.ApplicationServices;
     4 using Autodesk.AutoCAD.Geometry;
     5 using Autodesk.Civil.DatabaseServices;
     6 
     7 namespace 翻模工具
     8 {
     9     /// <summary>
    10     /// 2019年5月23日
    11     /// 计算选定范围内的平均曲面高程
    12     /// </summary>
    13     class MeanHeight
    14     {
    15         public void CalMeanHeigt()
    16         {
    17             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.CurrentDocument;
    18             Database db = doc.Database;
    19             TypedValue[] tv = new TypedValue[]
    20                {
    21                 new TypedValue((int)DxfCode.Start,"LWPOLYLINE")
    22                };
    23             SelectionFilter sf = new SelectionFilter(tv);
    24             PromptSelectionResult psr = doc.Editor.GetSelection(sf);
    25             if (psr.Status != PromptStatus.OK) return;
    26             SelectionSet ss = psr.Value;
    27             PromptEntityOptions peo = new PromptEntityOptions("拾取曲面");
    28             peo.SetRejectMessage("
    请选择三角网曲面");
    29             peo.AddAllowedClass(typeof(TinSurface), true);
    30             PromptEntityResult per = doc.Editor.GetEntity(peo);
    31             if (per.Status != PromptStatus.OK) return;
    32             using (Transaction tr = doc.TransactionManager.StartTransaction())
    33             {
    34                 BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
    35                 BlockTableRecord btr = bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord;
    36                 TinSurface sur = per.ObjectId.GetObject(OpenMode.ForRead) as TinSurface;
    37                 foreach (ObjectId id in ss.GetObjectIds())
    38                 {
    39                     Polyline pl = id.GetObject(OpenMode.ForRead) as Polyline;
    40                     Point3dCollection pts = new Point3dCollection();
    41                     for (int i = 0; i < pl.NumberOfVertices; i++)
    42                     {
    43                         pts.Add(pl.GetPoint3dAt(i));
    44                     }
    45                     if (pts[0].DistanceTo(pts[pts.Count - 1]) != 0)
    46                     {
    47                         pts.Add(pts[0]);
    48                     }
    49                     double h = sur.GetBoundedVolumes(pts).Net / pl.Area;
    50                     Point3d pt1 = pl.GeometricExtents.MaxPoint;
    51                     Point3d pt2 = pl.GeometricExtents.MinPoint;
    52                     Point3d pt = pt2 + (pt1 - pt2)/2;
    53                     DBText t = new DBText();
    54                     t.TextString = h.ToString("0.000");
    55                     t.Position = pt;
    56                     t.HorizontalMode = TextHorizontalMode.TextCenter;
    57                     t.VerticalMode = TextVerticalMode.TextVerticalMid;
    58                     t.AlignmentPoint = pt;
    59                     t.Height = 2.5;
    60                     t.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByColor, 1);
    61                     btr.AppendEntity(t);
    62                     tr.AddNewlyCreatedDBObject(t, true);
    63                 }
    64                 tr.Commit();
    65             }
    66         }
    67     }
    68 }

    当然代码还不完善,

    如果要有通用性,

    还要进一步完善。

    测试结果如下:

  • 相关阅读:
    Linux驱动下的platform总线架构(转)
    一生中很值得看的30个故事之一断箭
    学习嵌入式LINUX系统的笔记和体会
    DIY:自己动手做一个迷你 Linux 系统
    linux里面i386 i686 i486 i586代表什么?是什么意思
    菜鸟编译Linux内核
    LINUX核心重编与升级
    ARM 内核移植中常见的错误
    Linux 2.6.19.x 内核编译配置选项简介
    基于S3C2410平台移植Linux 2.6内核指南
  • 原文地址:https://www.cnblogs.com/myzw/p/10915870.html
Copyright © 2011-2022 走看看