请问cabinsummer你写这句(cvunit (vla-get-angle (vlax-ename->vla-object (car (entsel)))) ...
没有任何区别,就是最后一步把弧度转换为角度的方法不同。我用的是cvunit函数,可读型好些,他用的是计算。 VBALISPER 发表于 2011-11-2 12:16 static/image/common/back.gif
一点建议,这个量出来的角度不是传统意义上的方位角,是CAD的角度.传统的方位角,0度是在正北方.应该还要加上一 ...
AutoCAD是可以定义0度角方向的 本帖最后由 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
cabinsummer 发表于 2011-11-2 20:01 static/image/common/back.gif
AutoCAD是可以定义0度角方向的
请问CAD如何定义零方向呢?正想学习这个
.
本帖最后由 VBALISPER 于 2011-11-2 21:02 编辑哦,这个定义倒是可以.但是我们习惯性不改动这个设置,如果将0度设到上方后,当画坡度时,又要换算了,向右的20度坡度就相当于北方为0度的70度.这个设置只能顾得了一边.所以我一般都不动,总结了一下方位的角度.就是如果<90度,=90-X,如果>90,=450-X.
另外,你用cvunit转换为度的我搞懂了,谢谢
有时间帮我看看9楼写的,我用IF写的判断,怎么不能实现呢.是不是计算过程中有格式不对呀.谢谢了哈
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 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)) 个人观点,要想彻底解决,我的思路是:
获取line两个端点p1、p2
判断
p1 p2 水平向右则角度为90
反之角度为270
竖直向上则角度为0
反之角度为180
不符合上述条件可以大胆地求得(y2-y1)/(x2-x1)
然后判断象限利用反正切函数取得角度值 mrhvslisp 发表于 2011-11-2 20:19 static/image/common/back.gif
请问CAD如何定义零方向呢?正想学习这个
CAD的单位设置里,手动设置