.NET

.NET

Reply
Active Contributor
AdriDicri
Posts: 34
Registered: ‎09-23-2011
Message 1 of 6 (649 Views)
Accepted Solution

[VB.Net] IntersectWith Surfaces Acad 2013 / 2014

649 Views, 5 Replies
12-19-2013 01:29 AM

Hello !

 

I'm currently using Autocad 2013, and I need to use the function intersectWith with 2 surfaces. The message i get is "Not yet implemented".


Can somebody tell me if this function is working in Autocad 2014?

 

Thanks in advance.

 

Adri DiCri.

 

I suspect that a surface/surface compatible Entity.IntersectWith method is still some time away. 

 

The Autodesk.AutoCAD.Geometry.SurfaceSurfaceIntersector can be used but the database surfaces need to be translated.  That can be accomplished via    Autodesk.AutoCAD.BoundaryRepresentation.Face.GetSurfaceAsNurb Method.

 

 A fairly convoluted process to be sure, but quite possible.

 

Another possibility may be to thicken one of the surfaces into a solid, and Imprint the other surface onto that.  The pertinent face of that solid would need to be analyzed to return the resultant imprinted geometry.

I have a demo routine that, unfortunately, I do not have the time to translate.   Hopefully you can make use of the c# code.  The routine was used to create the attached example.

 

using System;

using System.Runtime.InteropServices;

using Autodesk.AutoCAD;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.BoundaryRepresentation;

 

[assembly: CommandClass(typeof(CsSurfIntersect.STSCCommands))]

namespace CsSurfIntersect

{

publicclassSTSCCommands

{

public STSCCommands()

{

}

[CommandMethod("SurfInt")]

staticpublicvoid SurfInt()

{

Database db = HostApplicationServices.WorkingDatabase;

Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

ObjectId ObjID;

using (Transaction trans = db.TransactionManager.StartTransaction())

{

try

{

Autodesk.AutoCAD.DatabaseServices.Surface surf1;

Autodesk.AutoCAD.DatabaseServices.Surface surf2;

SurfGeomConstruct sgc1;

SurfGeomConstruct sgc2;

PromptEntityOptions peo = newPromptEntityOptions("Select first surface for intersection: ");

peo.SetRejectMessage("\nPlease select only a Surface");

peo.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Surface), false);

PromptEntityResult per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK) return;

ObjID = per.ObjectId;

surf1 = (Autodesk.AutoCAD.DatabaseServices.Surface)trans.GetObject(ObjID, OpenMode.ForRead, false);

surf1.Highlight();

peo.Message = "Select intersecting surface: ";

per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK) return;

surf1.Unhighlight();

sgc1 = newSurfGeomConstruct(surf1);

 

ObjID = per.ObjectId;

surf2 = (Autodesk.AutoCAD.DatabaseServices.Surface)trans.GetObject(ObjID, OpenMode.ForRead, false);

sgc2 = newSurfGeomConstruct(surf2);

SurfaceSurfaceIntersector ssi = newSurfaceSurfaceIntersector();

ssi.Set(sgc1.GeomSurf, sgc2.GeomSurf);

int count = ssi.NumResults;

if (count < 1) return;

BlockTableRecord btr = (BlockTableRecord)(trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite));

for (int i = 0; i < count; i++)

{

Curve3d c3d = ssi.IntersectCurve(i, true);

Curve crv = GenCurve(c3d);

crv.SetDatabaseDefaults();

btr.AppendEntity(crv);

trans.AddNewlyCreatedDBObject(crv, true);

}

if (ssi != null) ssi.Dispose();

if (sgc1.GeomSurf != null) sgc1.GeomSurf.Dispose();

if (sgc2.GeomSurf != null) sgc2.GeomSurf.Dispose();

}

catch (System.Exception ex)

{

ed.WriteMessage("Error: " + ex.Message);

}

finally

{

trans.Commit();

}

}

}

//Internal

staticprivateCurve GenCurve(Curve3d crv3d)

{

Tolerance tol = newTolerance();

ExternalCurve3d extCrv = crv3d asExternalCurve3d;

Line3d ln3d;

if (extCrv.IsLinear(out ln3d))

{

Line ln = newLine(crv3d.StartPoint, crv3d.EndPoint);

return ln;

}

else

{

Double per;

KnotCollection kc;

NurbCurve3d nc3d = extCrv.NativeCurve asNurbCurve3d;

kc = nc3d.Knots;

Double[] dblKnots = newDouble[kc.Count];

kc.CopyTo(dblKnots, 0);

DoubleCollection dc = newDoubleCollection(dblKnots);

NurbCurve3dData nc3dData = nc3d.DefinitionData;

returnnewSpline(nc3d.Degree, nc3d.IsRational, nc3d.IsClosed(), nc3d.IsPeriodic(out per),

nc3dData.ControlPoints, dc, nc3dData.Weights, tol.EqualPoint, tol.EqualVector);

}

}

 

}

classSurfGeomConstruct

{

private Autodesk.AutoCAD.Geometry.Surface m_geomSurf;

//Constructors

public SurfGeomConstruct(Autodesk.AutoCAD.DatabaseServices.Surface Surf)

{

GeomSurfGenerator(Surf);

}

//Properties

public Autodesk.AutoCAD.Geometry.Surface GeomSurf

{

get { return m_geomSurf; }

}

//Methods

privatevoid GeomSurfGenerator(Autodesk.AutoCAD.DatabaseServices.Surface Surf)

{

Brep Br = newBrep(Surf);

foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face fc in Br.Faces)

{

ExternalBoundedSurface[] ebSurfs = fc.GetSurfaceAsTrimmedNurbs();

m_geomSurf = ebSurfs[0];

}

Br.Dispose();

}

}

}

 

 

Distinguished Contributor
SEANT61
Posts: 137
Registered: ‎09-23-2008
Message 2 of 6 (606 Views)

Re: [VB.Net] IntersectWith Surfaces Acad 2013 / 2014

12-20-2013 11:40 PM in reply to: AdriDicri

I suspect that a surface/surface compatible Entity.IntersectWith method is still some time away. 

 

The Autodesk.AutoCAD.Geometry.SurfaceSurfaceIntersector can be used but the database surfaces need to be translated.  That can be accomplished via    Autodesk.AutoCAD.BoundaryRepresentation.Face.GetSurfaceAsNurb Method.

 

 A fairly convoluted process to be sure, but quite possible.

 

Another possibility may be to thicken one of the surfaces into a solid, and Imprint the other surface onto that.  The pertinent face of that solid would need to be analyzed to return the resultant imprinted geometry.

Active Contributor
AdriDicri
Posts: 34
Registered: ‎09-23-2011
Message 3 of 6 (547 Views)

Re: [VB.Net] IntersectWith Surfaces Acad 2013 / 2014

01-02-2014 04:13 AM in reply to: SEANT61

Hello again !

 

I managed to have a result with the SurfaceSurfaceIntersector but (and don't laught) I can't retrieve the intersection points between my two surfaces.

 

Which method of SurfaceIntersector should I use to get my points?

 

I'm sure i should have a result, because the "NumResult" give me 1, so i guess it's correct?

 

 

'Brep surface 1
Using brep As New Brep(surf) Dim acFaceColl As BrepFaceCollection = brep.Faces For Each face2 As Autodesk.AutoCAD.BoundaryRepresentation.Face In acFaceColl
Dim sGeo As Autodesk.AutoCAD.Geometry.NurbSurface = face2.GetSurfaceAsNurb()

'other stuff For i As Integer = 0 To dbsurfaceFace3D.Count - 1
'other stuff intersectPoints.Clear() entFace3D = dbsurfaceFace3D(i)

'Brep surface 2 Using brep2 As New Brep(entFace3D) For Each face3 As Autodesk.AutoCAD.BoundaryRepresentation.Face In acFaceColl Dim sGeo2 As Autodesk.AutoCAD.Geometry.NurbSurface = face3.GetSurfaceAsNurb() ssi = New Autodesk.AutoCAD.Geometry.SurfaceSurfaceIntersector(sGeo2, sGeo)

'stuck here *********

Next End Using Next Next End Using

 

This code is not very nice, but it's just to make some tests :smileywink:

 

Best regards, and best wishes for 2014 !

Distinguished Contributor
SEANT61
Posts: 137
Registered: ‎09-23-2008
Message 4 of 6 (521 Views)

Re: [VB.Net] IntersectWith Surfaces Acad 2013 / 2014

01-02-2014 04:29 PM in reply to: AdriDicri

I have a demo routine that, unfortunately, I do not have the time to translate.   Hopefully you can make use of the c# code.  The routine was used to create the attached example.

 

using System;

using System.Runtime.InteropServices;

using Autodesk.AutoCAD;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.BoundaryRepresentation;

 

 

 

[assembly: CommandClass(typeof(CsSurfIntersect.STSCCommands))]

namespace CsSurfIntersect

{

publicclassSTSCCommands

{

public STSCCommands()

{

}

[CommandMethod("SurfInt")]

staticpublicvoid SurfInt()

{

Database db = HostApplicationServices.WorkingDatabase;

Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

ObjectId ObjID;

using (Transaction trans = db.TransactionManager.StartTransaction())

{

try

{

Autodesk.AutoCAD.DatabaseServices.Surface surf1;

Autodesk.AutoCAD.DatabaseServices.Surface surf2;

SurfGeomConstruct sgc1;

SurfGeomConstruct sgc2;

PromptEntityOptions peo = newPromptEntityOptions("Select first surface for intersection: ");

peo.SetRejectMessage("\nPlease select only a Surface");

peo.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Surface), false);

PromptEntityResult per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK) return;

ObjID = per.ObjectId;

surf1 = (Autodesk.AutoCAD.DatabaseServices.Surface)trans.GetObject(ObjID, OpenMode.ForRead, false);

surf1.Highlight();

peo.Message = "Select intersecting surface: ";

per = ed.GetEntity(peo);

if (per.Status != PromptStatus.OK) return;

surf1.Unhighlight();

sgc1 = newSurfGeomConstruct(surf1);

 

ObjID = per.ObjectId;

surf2 = (Autodesk.AutoCAD.DatabaseServices.Surface)trans.GetObject(ObjID, OpenMode.ForRead, false);

sgc2 = newSurfGeomConstruct(surf2);

SurfaceSurfaceIntersector ssi = newSurfaceSurfaceIntersector();

ssi.Set(sgc1.GeomSurf, sgc2.GeomSurf);

int count = ssi.NumResults;

if (count < 1) return;

BlockTableRecord btr = (BlockTableRecord)(trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite));

for (int i = 0; i < count; i++)

{

Curve3d c3d = ssi.IntersectCurve(i, true);

Curve crv = GenCurve(c3d);

crv.SetDatabaseDefaults();

btr.AppendEntity(crv);

trans.AddNewlyCreatedDBObject(crv, true);

}

if (ssi != null) ssi.Dispose();

if (sgc1.GeomSurf != null) sgc1.GeomSurf.Dispose();

if (sgc2.GeomSurf != null) sgc2.GeomSurf.Dispose();

}

catch (System.Exception ex)

{

ed.WriteMessage("Error: " + ex.Message);

}

finally

{

trans.Commit();

}

}

}

 

//Internal

staticprivateCurve GenCurve(Curve3d crv3d)

{

Tolerance tol = newTolerance();

ExternalCurve3d extCrv = crv3d asExternalCurve3d;

Line3d ln3d;

if (extCrv.IsLinear(out ln3d))

{

Line ln = newLine(crv3d.StartPoint, crv3d.EndPoint);

return ln;

}

else

{

Double per;

KnotCollection kc;

NurbCurve3d nc3d = extCrv.NativeCurve asNurbCurve3d;

kc = nc3d.Knots;

Double[] dblKnots = newDouble[kc.Count];

kc.CopyTo(dblKnots, 0);

DoubleCollection dc = newDoubleCollection(dblKnots);

NurbCurve3dData nc3dData = nc3d.DefinitionData;

returnnewSpline(nc3d.Degree, nc3d.IsRational, nc3d.IsClosed(), nc3d.IsPeriodic(out per),

nc3dData.ControlPoints, dc, nc3dData.Weights, tol.EqualPoint, tol.EqualVector);

}

}

 

}

classSurfGeomConstruct

{

private Autodesk.AutoCAD.Geometry.Surface m_geomSurf;

//Constructors

public SurfGeomConstruct(Autodesk.AutoCAD.DatabaseServices.Surface Surf)

{

GeomSurfGenerator(Surf);

}

//Properties

public Autodesk.AutoCAD.Geometry.Surface GeomSurf

{

get { return m_geomSurf; }

}

//Methods

privatevoid GeomSurfGenerator(Autodesk.AutoCAD.DatabaseServices.Surface Surf)

{

Brep Br = newBrep(Surf);

foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face fc in Br.Faces)

{

ExternalBoundedSurface[] ebSurfs = fc.GetSurfaceAsTrimmedNurbs();

m_geomSurf = ebSurfs[0];

}

Br.Dispose();

}

}

}

 

 

Distinguished Contributor
SEANT61
Posts: 137
Registered: ‎09-23-2008
Message 5 of 6 (520 Views)

Re: [VB.Net] IntersectWith Surfaces Acad 2013 / 2014

01-02-2014 04:33 PM in reply to: SEANT61

****, formatting was quite botched above.  Maybe the attached will read better.

Active Contributor
AdriDicri
Posts: 34
Registered: ‎09-23-2011
Message 6 of 6 (506 Views)

Re: [VB.Net] IntersectWith Surfaces Acad 2013 / 2014

01-03-2014 12:37 AM in reply to: AdriDicri

Great ! Thanks a lot !

 

Adri DiCri

Post to the Community

Have questions about Autodesk products? Ask the community.

New Post
Announcements
Do you have 60 seconds to spare? The Autodesk Community Team is revamping our site ranking system and we want your feedback! Please click here to launch the 5 question survey. As always your input is greatly appreciated.