明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3966|回复: 6

[分享]绘制剖断线(C#)

[复制链接]
发表于 2009-11-26 16:05:00 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Text;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.Runtime;
  8. namespace CsMgd1
  9. {
  10.     public class Class1
  11.     {
  12.         Database db = HostApplicationServices.WorkingDatabase;
  13.         Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  14.         [CommandMethod("Test")]
  15.         public void Test()
  16.         {
  17.             ed.WriteMessage("\n绘制剖断线  By carrot1983");
  18.    PromptPointResult proPtRes1;
  19.    PromptPointOptions proPtOpts1 = new PromptPointOptions("\n指定第一点: ");
  20.    proPtRes1 = ed.GetPoint(proPtOpts1);
  21.    Point3d pt1 = proPtRes1.Value;
  22.    PromptPointResult proPtRes2;
  23.    PromptPointOptions proPtOpts2 = new PromptPointOptions("\n指定第二点: ");
  24.             proPtOpts2.UseDashedLine = true;
  25.    proPtOpts2.UseBasePoint = true;
  26.             proPtOpts2.BasePoint = pt1;
  27.    proPtRes2 = ed.GetPoint(proPtOpts2);
  28.    Point3d pt2 = proPtRes2.Value;
  29.             Point2dCollection pts = GetPoDuanPoints(pt1, pt2);
  30.             ObjectId pline = AddPline(pts, 0.0);
  31.         }
  32.         //取得两点间角度
  33.         public static double Get2PointsAngle(Point3d pt1, Point3d pt2)
  34.         {
  35.             Vector3d v1 = pt1.GetVectorTo(pt2);
  36.             return v1.GetAngleTo(Vector3d.XAxis);
  37.         }
  38.         //按方向和距离求取点
  39.         public static Point3d PolarPoint(Point3d basePt, double angle, double distance)
  40.         {
  41.             double[] pt = new double[3];
  42.             pt[0] = basePt[0] + distance * Math.Cos(angle);
  43.             pt[1] = basePt[1] + distance * Math.Sin(angle);
  44.             pt[2] = basePt[2];
  45.             Point3d point = new Point3d(pt[0], pt[1], pt[2]);
  46.             return point;
  47.         }
  48.         //计算剖断线的顶点表
  49.         public static Point2dCollection GetPoDuanPoints(Point3d pt1, Point3d pt2)
  50.         {
  51.              double ang = Get2PointsAngle(pt1, pt2);
  52.              Point3d leftPt = PolarPoint(pt1, ang+Math.PI, 56);
  53.              Point3d rightPt = PolarPoint(pt2, ang, 56);
  54.              Point3d middlePt = new Point3d((leftPt.X + rightPt.X) * 0.5, (leftPt.Y + rightPt.Y) * 0.5, (leftPt.Z + rightPt.Z) * 0.5);
  55.              Point3d leftPt1 = PolarPoint(middlePt, ang + Math.PI, 26);
  56.              Point3d leftPt2 = PolarPoint(PolarPoint(middlePt, ang + Math.PI, 12), ang + Math.PI * 0.5, 44);
  57.              Point3d rightPt1 = PolarPoint(middlePt, ang, 26);
  58.              Point3d rightPt2 = PolarPoint(PolarPoint(middlePt, ang, 12), ang + Math.PI * 1.5, 44);
  59.              Point2dCollection pts = new Point2dCollection();
  60.              pts.Add(new Point2d (leftPt.X,leftPt.Y));
  61.              pts.Add(new Point2d(leftPt1.X, leftPt1.Y));
  62.              pts.Add(new Point2d(leftPt2.X, leftPt2.Y));
  63.              pts.Add(new Point2d(rightPt2.X, rightPt2.Y));
  64.              pts.Add(new Point2d(rightPt1.X, rightPt1.Y));
  65.              pts.Add(new Point2d(rightPt.X, rightPt.Y));
  66.              return pts;
  67.         }
  68.         // 由二维点集合和线宽创建二维优化多段线的函数.
  69.         public static ObjectId AddPline(Point2dCollection pts, double width)
  70.         {
  71.             try
  72.             {
  73.                 int n = pts.Count;
  74.                 Polyline ent = new Polyline();
  75.                 for (int i = 0; i < n; i++)
  76.                     ent.AddVertexAt(i, pts[i], 0, width, width);
  77.                 ObjectId entId = AppendEntity(ent);
  78.                 return entId;
  79.             }
  80.             catch
  81.             {
  82.                 ObjectId nullId = ObjectId.Null;
  83.                 return nullId;
  84.             }
  85.         }
  86.         // 将图形对象加入到模型空间的函数.
  87.         public static ObjectId AppendEntity(Entity ent)
  88.         {
  89.             Database db = HostApplicationServices.WorkingDatabase;
  90.             ObjectId entId;
  91.             using (Transaction trans = db.TransactionManager.StartTransaction())
  92.             {
  93.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  94.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  95.                 entId = btr.AppendEntity(ent);
  96.                 trans.AddNewlyCreatedDBObject(ent, true);
  97.                 trans.Commit();
  98.             }
  99.             return entId;
  100.         }
  101.     }
  102. }
绘制剖断线,我是先用LISP写一遍,再用C#将LISP翻译过来当做练习。
结果不知道为什么。LISP执行的是OK的。
C#执行过程中在两点角度为[0 PI] 是OK的,但是在(PI 2PI)点位错掉了。
呵呵,果然C#很难走顺畅。。。
将LISP附上:
  1. (defun C:PD (/ PT1 PT2 PTS)
  2.   (princ "\n★绘制剖断线 By carrot1983")
  3.   (if (and (setq PT1 (getpoint "\n指定第一点: "))
  4.     (setq PT2 (getpoint PT1 "\n指定第二点: "))
  5.     (setq PTS (C-DRAW_PODUAN PT1 PT2))
  6.       )
  7.     (progn
  8.       (command "_.PLINE")
  9.       (foreach X PTS
  10. (command "_NON" X)
  11.       )
  12.       (command "")
  13.     )
  14.   )
  15.   (princ)
  16. )
  17. (defun C-DRAW_PODUAN
  18.        (PT1 PT2 / ANG LPT LPT1 LPT2 MPT PTS RPT RPT1 RPT2 X Y)
  19.   (setq ANG (angle PT1 PT2))
  20.   (setq LPT (polar PT1 (+ ANG pi) 56))
  21.   (setq RPT (polar PT2 ANG 56))
  22.   (setq MPT (mapcar
  23.        '(lambda (X Y) (* (+ X Y) 0.5))
  24.        LPT
  25.        RPT
  26.      )
  27.   )
  28.   (setq LPT1 (polar MPT (+ ANG pi) 26))
  29.   (setq LPT2 (polar MPT (+ ANG pi) 12))
  30.   (setq LPT2 (polar LPT2 (+ ANG (* 0.5 pi)) 44))
  31.   (setq RPT1 (polar MPT ANG 26))
  32.   (setq RPT2 (polar MPT ANG 12))
  33.   (setq RPT2 (polar RPT2 (+ ANG (* 1.5 pi)) 44))
  34.   (setq PTS (list LPT LPT1 LPT2 RPT2 RPT1 RPT))
  35. )

评分

参与人数 1威望 +1 明经币 +1 收起 理由
雪山飞狐_lzh + 1 + 1 【好评】好程序 carrot最好贴个图说明下

查看全部评分

发表于 2009-11-26 17:42:00 | 显示全部楼层

将Lisp的运行结果图片贴上让看看,不知道啥叫剖断线

发表于 2009-12-9 15:49:00 | 显示全部楼层
你的这个剖断线跟剖面图是不是一个东西的
发表于 2013-6-23 21:32:40 | 显示全部楼层
不能设置比例,不太好
发表于 2014-5-6 23:14:11 | 显示全部楼层
路过并表示强烈支持!
发表于 2014-5-27 16:49:34 | 显示全部楼层
角度转换有问题
发表于 2014-5-28 16:08:18 | 显示全部楼层
萝卜兄转战.NET了?你的拉移随心已经成名已久啦!你的剖断线程序,我测试了是后面的角度转换有问题,改过后就行了。不知道你解决没有?
  1. public static Point2dCollection GetVertexAndPoints(Point3d pt1, Point3d pt2,double offset_x,double offset_y,double offset_end)
  2.         {
  3.              Point2d p1 = new Point2d(pt1.X, pt1.Y);
  4.              Point2d p2 = new Point2d(pt2.X, pt2.Y);
  5.              double ang = GetTwoPoints2DAngle(p1, p2);
  6.              double length = p1.GetDistanceTo(p2);
  7.              //offset_x = 120.0;
  8.              //offset_y = 220.0;
  9.              //offset_end=500.0;
  10.              //角度定义
  11.              double ang_pi = Rad2Ang(180.0) + ang;
  12.              double ang_half_pi = Rad2Ang(90.0) + ang;
  13.              double ang_half_pi2 = ang - Rad2Ang(90.0);
  14.              //起始点
  15.              Point2d StartPoint = PolarPoint(p1, ang_pi, 500.0);
  16.              Point2d EndPoint = PolarPoint(p2, ang, 500.0);
  17.              //中点
  18.              Point2d middlePt = PolarPoint(p1, ang, 0.5 * length);
  19.              //左右第一点
  20.              Point2d leftPt1 = PolarPoint(middlePt, ang_pi, 0.5 * offset_x);
  21.              Point2d rightPt1 = PolarPoint(middlePt, ang, 0.5 * offset_x);
  22.              //L2、R2投影点
  23.              Point2d PtL = PolarPoint(middlePt, ang_pi, 0.25 * offset_x);
  24.              Point2d PtR = PolarPoint(middlePt, ang, 0.25 * offset_x);
  25.              //左右第二点
  26.              Point2d leftPt2 = PolarPoint(PtL, ang_half_pi, 0.5 * offset_y);
  27.              Point2d rightPt2 = PolarPoint(PtR, ang_half_pi2, 0.5 * offset_y);
  28.              //添加到点集
  29.              Point2dCollection pts = new Point2dCollection();
  30.              pts.Add(StartPoint); //起点
  31.              pts.Add(new Point2d(leftPt1.X, leftPt1.Y));
  32.              pts.Add(new Point2d(leftPt2.X, leftPt2.Y));
  33.              pts.Add(new Point2d(rightPt2.X, rightPt2.Y));
  34.              pts.Add(new Point2d(rightPt1.X, rightPt1.Y));
  35.              pts.Add(EndPoint);   //终点1
  36.              return pts;
  37.         }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:45 , Processed in 0.168478 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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