资源描述
CAD获取一个图形上所有直线的交点
纯数学运算的方法做的 通过构建二元一次方程 然后 判断相交点是否在线上...代码完全可行哈
using (var tr = doc.TransactionManager.StartTransaction())
{
var lines = new List<Line>();
foreach(ObjectId id in res.Value.GetObjectIds())
{
lines.Add((Line)tr.GetObject(id, OpenMode.ForRead));
}
List<Point3d> pts = new List<Point3d>();
for (int m = 0; m < lines.Count; m++)
{
LineSegment3d ls1 = new LineSegment3d(lines[m].StartPoint, lines[m].EndPoint);
for (int n = m + 1; n < lines.Count; n++)
{
LineSegment3d ls2 = new LineSegment3d(lines[n].StartPoint, lines[n].EndPoint);
CurveCurveIntersector3d cc3d = new CurveCurveIntersector3d(ls1, ls2, Vector3d.ZAxis);
if (cc3d.NumberOfIntersectionPoints == 1)
{
pts.Add(cc3d.GetIntersectionPoint(0));
}
}
}
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
foreach (var pt in pts)
{
Circle c = new Circle(pt, Vector3d.ZAxis, 1);
btr.AppendEntity(c);
tr.AddNewlyCreatedDBObject(c, true);
}
tr.Commit();
}
}
另一个可行切简洁的代码
[CommandMethod("tx1")]
public static void CrossCAD()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
var sf = new SelectionFilter(new TypedValue[]{ new TypedValue(0, "line")});
var res = ed.SelectAll(sf);
if (res.Status != PromptStatus.OK) return;
using (var tr = doc.TransactionManager.StartTransaction())
{
var lines = new List<Line>();
foreach(ObjectId id in res.Value.GetObjectIds())
{
lines.Add((Line)tr.GetObject(id, OpenMode.ForRead));
}
List<Point3d> pts = new List<Point3d>();
for (int m = 0; m < lines.Count; m++)
{
LineSegment3d ls1 = new LineSegment3d(lines[m].StartPoint, lines[m].EndPoint);
for (int n = m + 1; n < lines.Count; n++)
{
LineSegment3d ls2 = new LineSegment3d(lines[n].StartPoint, lines[n].EndPoint);
CurveCurveIntersector3d cc3d = new CurveCurveIntersector3d(ls1, ls2, Vector3d.ZAxis);
if (cc3d.NumberOfIntersectionPoints == 1)
{
pts.Add(cc3d.GetIntersectionPoint(0));
}
}
}
BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
foreach (var pt in pts)
{
Circle c = new Circle(pt, Vector3d.ZAxis, 1);
btr.AppendEntity(c);
tr.AddNewlyCreatedDBObject(c, true);
}
tr.Commit();
}
}
展开阅读全文