• CAD(C#)——"小知识点"


    ①: 隐藏实体

         在CAD的开发中,有时候我们需要根据用户的需求隐藏和显示一些实体,对于实体本身的属性Visible当然可以实现隐藏、显示实体,不过,除此之外,我们还可以将一个层上的实体同时隐藏起来,这就要使用LayerTableRecord中的IsOff属性,并且隐藏的实体ObjectId可以出现在SelectAll()的集合中.当然,他们之间还是有区别的,当你用Ctrl+A,选中当前活动文档的全部实体是,你就会发现原来他们之间区别。

         简单的测试程序:

    代码
     1  #region 测试图层的IsOff和实体的Visible是否一致
     2         [CommandMethod("TestLayer")]
     3         public void TestLayerVis()
     4         {
     5             //选择一点创建实体
     6             PromptPointOptions opt = new PromptPointOptions("选择起始点:");
     7             PromptPointResult res = ed.GetPoint(opt);
     8             if (PromptStatus.OK == res.Status)
     9             {
    10                 Point3d sPt = res.Value;
    11                 using (Transaction trans = db.TransactionManager.StartTransaction())
    12                 {
    13                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
    14                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    15                     //直线,其所在层为默认的层
    16                     Line line = new Line();
    17                     line.StartPoint = sPt;
    18                     line.EndPoint = new Point3d(sPt.X + 100, sPt.Y + 500);
    19                     //圆,指定层
    20                     Circle c = new Circle(sPt, new Vector3d(001), 30);
    21                     c.LayerId = CreateLayer("TestLayer");
    22                     line.Visible = false//不显示实体
    23                     btr.AppendEntity(line);
    24                     btr.AppendEntity(c);
    25                     trans.AddNewlyCreatedDBObject(line, true);
    26                     trans.AddNewlyCreatedDBObject(c, true);
    27 
    28                     LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
    29                     LayerTableRecord ltr = (LayerTableRecord)trans.GetObject(CreateLayer("TestLayer"), OpenMode.ForWrite);
    30                     ltr.IsOff = true//关闭图层,隐藏图层上的实体
    31 
    32                     trans.Commit();
    33                 }
    34             }
    35         }
    36 
    37         //创建一个图层
    38         private ObjectId CreateLayer(string layerName)
    39         {
    40             ObjectId objId = ObjectId.Null;
    41             using (Transaction trans = db.TransactionManager.StartTransaction())
    42             {
    43                 LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
    44                 if (lt.Has(layerName))
    45                 {
    46                     objId = lt[layerName];
    47                 }
    48                 else
    49                 {
    50                     LayerTableRecord ltr = new LayerTableRecord();
    51                     ltr.Name = layerName;
    52                     objId = lt.Add(ltr);
    53                     trans.AddNewlyCreatedDBObject(ltr, true);
    54                     trans.Commit();
    55                 }
    56             }
    57 
    58             return objId;
    59         }
    60        #endregion 

    ②:修改线宽

         有的时候我们为了打印出来的图片更加的清楚,可能会设计到修改实体的线宽,对于多段线,我们很容易想到使用ConstantWidth,这样就可以修改其线宽了,其实,对于圆或是直线也一样,不过我们在修改他们的线宽之前要保证系统变量的lwdisplay的值为1(开),这时我们再设置LineWeight,就可以改变他们的线宽了。

         简单的测试程序:

    代码
     1  #region 测试直线、圆的LineWeight和PolyLine的ConstantWidth之间的区别
     2         [CommandMethod("TestLW")]
     3         public void TestLW()
     4         {
     5             PromptPointOptions opt = new PromptPointOptions("选择起点:");
     6             PromptPointResult res = ed.GetPoint(opt);
     7             if (PromptStatus.OK == res.Status)
     8             {
     9                 Point3d sPt = res.Value;
    10                 ObjectId plId = ObjectId.Null;
    11                 ObjectId circleId = ObjectId.Null;
    12                 using (Transaction trans = db.TransactionManager.StartTransaction())
    13                 {
    14                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
    15                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    16 
    17                     //创建一个多段线
    18                     Polyline pl = new Polyline();
    19                     pl.AddVertexAt(0, sPt.Convert2d(new Plane()), 000);
    20                     pl.AddVertexAt(1new Point3d(sPt.X + 100, sPt.Y + 500).Convert2d(new Plane()), 000);
    21                     pl.AddVertexAt(2new Point3d(sPt.X + 150, sPt.Y - 1500).Convert2d(new Plane()), 000);
    22 
    23                     //创建一个圆
    24                     Circle c = new Circle(sPt, new Vector3d(001), 40);
    25 
    26                     plId = btr.AppendEntity(pl);
    27                     circleId = btr.AppendEntity(c);
    28                     trans.AddNewlyCreatedDBObject(pl, true);
    29                     trans.AddNewlyCreatedDBObject(c, true);
    30                     //修改线宽
    31                     pl.ConstantWidth = 0.15;
    32                     c.LineWeight = LineWeight.LineWeight035;//绝对线宽
    33 
    34                     trans.Commit();
    35                 }
    36             }
    37         }
    38         #endregion

    ③:多段线凸起

          这个功能一般用在两条多段线相交时,区分多段线的走向而特意使相交的多段线在交点出凸起一个"小弧",在这个应用中,我们会发现PolyLine中的AddVertexAt的奇妙之处(插入点的序号可以小于PLine的节点数目,PLine的原有节点的序号会因为有新插入点而自增)。    

          简单的测试程序:

    代码
     1  [CommandMethod("TestPolyLine")]
     2         public void TestPolyLine()
     3         {
     4             PromptPointOptions opt = new PromptPointOptions("选择起点:");
     5             PromptPointResult res = ed.GetPoint(opt);
     6             if (PromptStatus.OK == res.Status)
     7             {
     8                 Point3d sPt = res.Value;
     9                 ObjectId plId = ObjectId.Null;
    10                 ObjectId circleId = ObjectId.Null;
    11                 Polyline pl = new Polyline();
    12                 using (Transaction trans = db.TransactionManager.StartTransaction())
    13                 {
    14                     BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
    15                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    16 
    17                     //创建一个多段线
    18                     pl.AddVertexAt(0, sPt.Convert2d(new Plane()), 000);
    19                     pl.AddVertexAt(1new Point3d(sPt.X + 200, sPt.Y + 1500).Convert2d(new Plane()), 000);
    20                     pl.AddVertexAt(2new Point3d(sPt.X + 400, sPt.Y + 800).Convert2d(new Plane()), 000);
    21 
    22                     btr.AppendEntity(pl);
    23                     trans.AddNewlyCreatedDBObject(pl, true);
    24                     ////加一个小弧
    25                     Point3d pt1 = pl.GetPointAtDist(80);
    26                     Point3d pt2 = pl.GetPointAtDist(100);
    27                     pl.AddVertexAt(1, pt1.Convert2d(new Plane()), 000);
    28                     pl.AddVertexAt(2, pt2.Convert2d(new Plane()), 000);
    29                     pl.SetBulgeAt(10.78);
    30                     
    31                     trans.Commit();
    32                 }
    33                 
    34             }
    35         }
  • 相关阅读:
    ucoreOS_lab5 实验报告
    ucoreOS_lab4 实验报告
    ucoreOS_lab3 实验报告
    ucoreOS_lab2 实验报告
    Mac OSX(Mac OS10.11) 安装 pwntools 失败的最新解决方案
    [最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
    ucoreOS_lab1 实验报告
    Mac下安装npm全局包提示权限不够
    【新特性速递】将纯色背景转换为内置主题!
    【新特性速递】回发时改变表格标题栏和数据!
  • 原文地址:https://www.cnblogs.com/wangyong/p/1651672.html
Copyright © 2020-2023  润新知