效果如下:
附部分代码如下:
public void 逆时针夹角Demo()
{
// 获取当前 CAD 文档和编辑器
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
try
{
Point3d vec1Start, vec1End;
if (!GetTwoPoints(ed, "请选择第一个向量的起点", "请选择第一个向量的终点", out vec1Start, out vec1End))
{
ed.WriteMessage("\n操作已取消。");
return;
}
db.AddLineToModeSpace(vec1Start, vec1End);
Point3d vec2Start, vec2End;
if (!GetTwoPoints(ed, "请选择第二个向量的起点", "请选择第二个向量的终点", out vec2Start, out vec2End))
{
ed.WriteMessage("\n操作已取消。");
return;
}
db.AddLineToModeSpace(vec2Start, vec2End); // 添加第二个向量到模型空间
Vector3d vec1 = vec1End - vec1Start; // 向量1 = 终点1 - 起点1
Vector3d vec2 = vec2End - vec2Start; // 向量2 = 终点2 - 起点2
double ccwAngle = vec1.逆时针角度(vec2); // 调用扩展方法
double angleDeg = ccwAngle * (180.0 / Math.PI); // 弧度转角度
var str = $"\n两个向量的逆时针夹角为:{angleDeg:F5}°";
ed.WriteMessage(str);
MessageBox.Show(str); // 显示结果
}
catch (Exception ex)
{
ed.WriteMessage($"\n错误:{ex.Message}");
}
}
/// <summary>
/// 辅助方法:提示用户选择两个点
/// </summary>
/// <returns>是否成功选择两个点</returns>
private bool GetTwoPoints(Editor ed, string firstPrompt, string secondPrompt, out Point3d p1, out Point3d p2)
{
p1 = Point3d.Origin;
p2 = Point3d.Origin;
// 选择第一个点
PromptPointOptions opt1 = new PromptPointOptions("\n" + firstPrompt);
PromptPointResult res1 = ed.GetPoint(opt1);
if (res1.Status != PromptStatus.OK) return false;
p1 = res1.Value;
// 选择第二个点
PromptPointOptions opt2 = new PromptPointOptions("\n" + secondPrompt)
{
UseBasePoint = true, // 允许使用基点(如相对坐标)
BasePoint = p1 // 基点设为第一个点,方便用户输入相对坐标
};
PromptPointResult res2 = ed.GetPoint(opt2);
if (res2.Status != PromptStatus.OK) return false;
p2 = res2.Value;
return true;
}