private bool IsHole(IFace2 face) { ISurface surf = face.IGetSurface(); if (surf.IsCylinder()) { double[] uvBounds = face.GetUVBounds() as double[]; double[] evalData = surf.Evaluate((uvBounds[1] - uvBounds[0]) / 2, (uvBounds[3] - uvBounds[2]) / 2, 1, 1) as double[]; double[] pt = new double[] { evalData[0], evalData[1], evalData[2] }; int sense = face.FaceInSurfaceSense() ? 1 : -1; double[] norm = new double[] { evalData[evalData.Length - 3] * sense, evalData[evalData.Length - 2] * sense, evalData[evalData.Length - 1] * sense }; double[] cylParams = surf.CylinderParams as double[]; double[] orig = new double[] { cylParams[0], cylParams[1], cylParams[2] }; double[] dir = new double[] { pt[0] - orig[0], pt[1] - orig[1], pt[2] - orig[2] }; IMathUtility mathUtils = swApp.IGetMathUtility(); IMathVector dirVec = mathUtils.CreateVector(dir) as IMathVector; IMathVector normVec = mathUtils.CreateVector(norm) as IMathVector; return(GetAngle(dirVec, normVec) < Math.PI / 2); } else { throw new NotSupportedException("Only cylindrical face is supported"); } }
public static bool GetDistance(this IFace2 entity0, IFace2 entity1, out double[] posacast, out double[] posbcast) { var bounds = entity1.GetUVBounds().CastArray<double>(); var param = new[] {bounds[0], bounds[2], bounds[1], bounds[3]}; object posa, posb; double distance; var result = ((IEntity) entity0).GetDistance(entity1, true, param, out posa, out posb, out distance); posacast = posa.CastArray<double>(); posbcast = posb.CastArray<double>(); return result == 0; }
public static bool GetDistance(this IFace2 entity0, IFace2 entity1, out double[] posacast, out double[] posbcast) { var bounds = entity1.GetUVBounds().CastArray <double>(); var param = new[] { bounds[0], bounds[2], bounds[1], bounds[3] }; object posa, posb; double distance; var result = ((IEntity)entity0).GetDistance(entity1, true, param, out posa, out posb, out distance); posacast = posa.CastArray <double>(); posbcast = posb.CastArray <double>(); return(result == 0); }
private static ICurve[] SplitFaceOnIsoCurves(IFace2 face, int curvesCount, bool vOrU) { var curves = new List <ICurve>(); var surf = face.IGetSurface(); var uvBounds = face.GetUVBounds() as double[]; var minU = uvBounds[0]; var maxU = uvBounds[1]; var minV = uvBounds[2]; var maxV = uvBounds[3]; double thisMin; double thisMax; double otherMin; double otherMax; if (vOrU) //if v param { thisMin = minV; thisMax = maxV; otherMin = minU; otherMax = maxU; } else //if u param { thisMin = minU; thisMax = maxU; otherMin = minV; otherMax = maxV; } var step = (thisMax - thisMin) / (curvesCount - 1); for (int i = 1; i < curvesCount - 1; i++) { var par = thisMin + i * step; var curve = surf.MakeIsoCurve2(vOrU, ref par); double u; double v; if (vOrU) { u = otherMin; v = par; } else { u = par; v = otherMin; } var pt = surf.Evaluate(u, v, 0, 0) as double[]; var startPt = new double[] { pt[0], pt[1], pt[2] }; if (vOrU) { u = otherMax; v = par; } else { u = par; v = otherMax; } pt = surf.Evaluate(u, v, 0, 0) as double[]; var endPt = new double[] { pt[0], pt[1], pt[2] }; curve = curve.CreateTrimmedCurve2(startPt[0], startPt[1], startPt[2], endPt[0], endPt[1], endPt[2]); curves.Add(curve); } return(curves.ToArray()); }