Here it is the way I was able to get the intersection (objects that can be used to build a points collection if required), it is based on 3d faces made of 4 points, see if helps (a quick one no error control, etc...):
Luis.
[CommandMethod("INTF", CommandFlags.Modal)]
public void cmd_intersFaces()
{
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
PromptEntityOptions peo = new PromptEntityOptions("");
peo.Message = "\n<Enter to exit>/Select first 3d face";
peo.SetRejectMessage("\n***Object must be a 3d face. \n");
peo.AddAllowedClass(typeof(Face), true);
peo.AllowNone = true;
PromptEntityResult per1 = ed.GetEntity(peo);
if (per1.Status != PromptStatus.OK) return;
peo.Message = "\n<Enter to exit>/Select second 3d face";
PromptEntityResult per2 = ed.GetEntity(peo);
if (per2.Status != PromptStatus.OK) return;
//Point3dCollection ints = new Point3dCollection();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord;
Face face1 = tr.GetObject(per1.ObjectId, OpenMode.ForWrite, false) as Face;
Face face2 = tr.GetObject(per2.ObjectId, OpenMode.ForWrite, false) as Face;
DBObjectCollection curveSegments = new DBObjectCollection();
DBObjectCollection regions = new DBObjectCollection();
Point3d p1, p2, p3, p4;
Line line = null;
p1 = face1.GetVertexAt(0);
p2 = face1.GetVertexAt(1);
p3 = face1.GetVertexAt(2);
p4 = face1.GetVertexAt(3);
line = new Line(p1, p2);
curveSegments.Add(line);
line = new Line(p2, p3);
curveSegments.Add(line);
line = new Line(p3, p4);
curveSegments.Add(line);
line = new Line(p4, p1);
curveSegments.Add(line);
regions = Region.CreateFromCurves(curveSegments);
Region region1 = (Region)regions[0];
p1 = face2.GetVertexAt(0);
p2 = face2.GetVertexAt(1);
p3 = face2.GetVertexAt(2);
p4 = face2.GetVertexAt(3);
curveSegments.Clear();
regions.Clear();
line = new Line(p1, p2);
curveSegments.Add(line);
line = new Line(p2, p3);
curveSegments.Add(line);
line = new Line(p3, p4);
curveSegments.Add(line);
line = new Line(p4, p1);
curveSegments.Add(line);
regions = Region.CreateFromCurves(curveSegments);
Region region2 = (Region)regions[0];
PlaneSurface psurface1 = new PlaneSurface();
psurface1.CreateFromRegion(region1);
PlaneSurface psurface2 = new PlaneSurface();
psurface2.CreateFromRegion(region2);
Entity[] entities = psurface1.BooleanIntersect(psurface2);
foreach (Entity e in entities)
{
// convert to curve objects
// or
// convert entities into lines or arcs
// or
// join them into a single object polyline
// or
// extract the points
// or
// append the object into the drawing if needed
//btr.AppendEntity(e);
//tr.AddNewlyCreatedDBObject(e, true);
}
tr.Commit();
}
}