gpt4 book ai didi

c# - .NET 中 AutoCAD 的垂直/切线对象捕捉问题

转载 作者:行者123 更新时间:2023-11-30 17:01:55 24 4
gpt4 key购买 nike

Here is an album of screenshots and corresponding descriptions which should storyboard the problem I'm about to describe .

现在,让我用数学术语和代码 (C#) 解释我的问题:

========================

给定:

  • 原点在 (0,0) 且半径 = 0.0364 的圆

  • 一条线段,它平行于圆的顶部并由一个小的边距分开(这样线段就不会与圆相切)。 margin 的大小无关紧要。线段长度为圆直径的 40%。

求解:

一条垂直线段,其起点位于上述直线的起点,终点与圆的边缘相接。

========================

我使用 AutoCAD 的对象捕捉功能没有收到我想要的结果。我尝试绘制的线段仅使用 OSnap 模式切线和垂直呈现对角线。 (请参阅以下 C# 示例):

示例 1:

bigCircle.GetObjectSnapPoints(
ObjectSnapModes.ModePerpendicular,
0,
tipTopCenterPoint1,
hatTopP3Dstart1,
fakematrix1,
p3dcolright,
icol1
)

...呈现新线折叠,成为对角线。我不知道它捕捉到什么,但这不是我想要的。

示例 2:此函数...

bigCircle.GetObjectSnapPoints(
ObjectSnapModes.ModeTangent,
0,
tipTopCenterPoint1,
hatTopP3Dstart1,
fakematrix1,
p3dcolright,
icol1
);

....使新线向外延伸,成为对角线。我相信这条线连接到与圆相切的点,但这不是我想要的。

这是我想要得到的;我该怎么做?

desired result

最佳答案

我不会尝试围绕用户如何执行此操作进行编程,而是坚持使用古老的数学方法来提高速度和简单性。您正在寻找的下落距离称为 Sagitta。以下是如何在代码中实现它以使其动态化:

[CommandMethod("MathIsCool")]
public void Draw_Method()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = AcadApplication.DocumentManager.MdiActiveDocument.Editor;

// Parameters (get from user prompt if desired)
var startP = new Point3d(0, 0, 0);
var r = 5.64;
var lineGap = 0.4;
var chordLen = r * 0.40;

try
{
using (Transaction acTrans = db.TransactionManager.StartOpenCloseTransaction())
{
var bt = (BlockTable)acTrans.GetObject(db.BlockTableId, OpenMode.ForWrite);
var btr = (BlockTableRecord)acTrans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

// Create the circle
var circ = new Circle(startP, Vector3d.ZAxis, r);
btr.AppendEntity(circ);
acTrans.AddNewlyCreatedDBObject(circ, true);

// Create the horizontal line
var hPt1 = new Point3d(startP.X - (chordLen / 2), startP.Y + (r + lineGap), 0);
var hPt2 = new Point3d(hPt1.X + chordLen, hPt1.Y, 0);
var hLine = new Line(hPt1, hPt2);
btr.AppendEntity(hLine);
acTrans.AddNewlyCreatedDBObject(hLine, true);

// Create the vertical line
// Arc sagitta = Sqrt(r*r-l*l);
var sag = Math.Sqrt(r * r - (chordLen / 2) * (chordLen / 2));
var vPt2 = new Point3d(hPt1.X, startP.Y + sag, 0);
var vLine = new Line(hPt1, vPt2);
btr.AppendEntity(vLine);
acTrans.AddNewlyCreatedDBObject(vLine, true);

acTrans.Commit();
}
}
catch (System.Exception ex)
{
Debug.WriteLine(ex.ToString());
ed.WriteMessage(ex.ToString());
}
}

您可以在此处阅读有关 Sagitta 的更多信息:http://www.mathopenref.com/sagitta.html

编辑:根据 100,000 次迭代中 60% 的性能提升,将事务更新为 StartOpenCloseTransaction。

关于c# - .NET 中 AutoCAD 的垂直/切线对象捕捉问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com