cabinsummer 发表于 2011-11-2 19:59:12

VBALISPER 发表于 2011-11-2 12:51 static/image/common/back.gif
请问cabinsummer你写这句(cvunit (vla-get-angle (vlax-ename->vla-object (car (entsel)))) ...

没有任何区别,就是最后一步把弧度转换为角度的方法不同。我用的是cvunit函数,可读型好些,他用的是计算。

cabinsummer 发表于 2011-11-2 20:01:04

VBALISPER 发表于 2011-11-2 12:16 static/image/common/back.gif
一点建议,这个量出来的角度不是传统意义上的方位角,是CAD的角度.传统的方位角,0度是在正北方.应该还要加上一 ...

AutoCAD是可以定义0度角方向的

mrhvslisp 发表于 2011-11-2 20:13:49

本帖最后由 mrhvslisp 于 2011-11-2 20:33 编辑


#region//求取坐标方位角
      
      public void NorthAngle()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            PromptEntityOptions options = new PromptEntityOptions("");
            options.Message = "\n请选取直线";
            options.SetRejectMessage("\n该实体不是直线,请重新选择");
            options.AddAllowedClass(typeof(Line), true);
            options.AllowNone = false;
            PromptEntityResult result=ed.GetEntity(options);
            if (result.Status == PromptStatus.OK)
            {
                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                  Line line = (Line)trans.GetObject(result.ObjectId, OpenMode.ForRead);
                  Point3d pt1 = line.StartPoint;
                  Point3d pt2 = line.EndPoint;
                  double angle;
                  double x = pt2.X - pt1.X;
                  double y = pt2.Y - pt1.Y;
                  if (y == 0)
                  {
                        if (x > 0)
                        {
                            angle = 90;
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                        else
                        {
                            angle = 270;
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                  }
                  else
                  {
                        angle = Math.Atan(Math.Abs(x) / Math.Abs(y)) * 360 / (2 * Math.PI);
                  }

                  if (x >=0)
                  {
                        if (y > 0)
                        {
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                        else if (y < 0)
                        {
                            angle = 180 - angle;
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                  }
                  else if (x < 0)
                  {
                        if (y < 0)
                        {
                            angle = 180 + angle;
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                        else if (y > 0)
                        {
                            angle = 360 - angle;
                            ed.WriteMessage("\n坐标方位角为{0}°", angle);
                        }
                  }

                }
                  
            }
      }

      #endregion


mrhvslisp 发表于 2011-11-2 20:19:26

cabinsummer 发表于 2011-11-2 20:01 static/image/common/back.gif
AutoCAD是可以定义0度角方向的

请问CAD如何定义零方向呢?正想学习这个

VBALISPER 发表于 2011-11-2 20:48:39

.

本帖最后由 VBALISPER 于 2011-11-2 21:02 编辑

哦,这个定义倒是可以.但是我们习惯性不改动这个设置,如果将0度设到上方后,当画坡度时,又要换算了,向右的20度坡度就相当于北方为0度的70度.这个设置只能顾得了一边.所以我一般都不动,总结了一下方位的角度.就是如果<90度,=90-X,如果>90,=450-X.

另外,你用cvunit转换为度的我搞懂了,谢谢
有时间帮我看看9楼写的,我用IF写的判断,怎么不能实现呢.是不是计算过程中有格式不对呀.谢谢了哈

cabinsummer 发表于 2011-11-2 21:11:32

VBALISPER 发表于 2011-11-2 12:46 static/image/common/back.gif
说干就干,写的这个出错了.没看出原因来.
(if (< (* (/ (vla-get-angle (vlax-ename->vla-object (ca ...

(* (/ (vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0)并不保存返回值到变量,所以你需要不停的选直线。改成下面的就可以了
(setq a (* (/ (vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0))
(if (<= a 90.0)(- 90.0 a)(- 450.0 a))

VBALISPER 发表于 2011-11-2 22:19:47

哦,我就是觉得一句话代码比较有意思,想一句话完成.看来是保存不了返回值,所以失败了哈.

cabinsummer 发表于 2011-11-3 00:33:59

VBALISPER 发表于 2011-11-2 22:19 static/image/common/back.gif
哦,我就是觉得一句话代码比较有意思,想一句话完成.看来是保存不了返回值,所以失败了哈.

一句话也能保存
(if (<= (setq a (* (/ vla-get-angle (vlax-ename->vla-object (car (entsel)))) pi) 180.0)) 90.0)(- 90.0 a)(-450.0 a))

roamer2000 发表于 2011-11-3 08:56:15

个人观点,要想彻底解决,我的思路是:
获取line两个端点p1、p2
判断
p1 p2 水平向右则角度为90
反之角度为270
竖直向上则角度为0
反之角度为180
不符合上述条件可以大胆地求得(y2-y1)/(x2-x1)
然后判断象限利用反正切函数取得角度值

VBALISPER 发表于 2011-11-3 09:48:15

mrhvslisp 发表于 2011-11-2 20:19 static/image/common/back.gif
请问CAD如何定义零方向呢?正想学习这个

CAD的单位设置里,手动设置
页: 1 [2] 3
查看完整版本: 求方位角