本文整理汇总了C#中CurveLoop.IsOpen方法的典型用法代码示例。如果您正苦于以下问题:C# CurveLoop.IsOpen方法的具体用法?C# CurveLoop.IsOpen怎么用?C# CurveLoop.IsOpen使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CurveLoop
的用法示例。
在下文中一共展示了CurveLoop.IsOpen方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateIShapeProfileDefIfPossible
/// <summary>
/// Determines if a curveloop can be exported as an I-Shape profile.
/// </summary>
/// <param name="exporterIFC">The exporter.</param>
/// <param name="profileName">The name of the profile.</param>
/// <param name="curveLoop">The curve loop.</param>
/// <param name="origPlane">The plane of the loop.</param>
/// <param name="projDir">The projection direction.</param>
/// <returns>The IfcIShapeProfileDef, or null if not possible.</returns>
/// <remarks>This routine works with I-shaped curveloops projected onto origPlane, in either orientation;
/// it does not work with H-shaped curveloops.</remarks>
private static IFCAnyHandle CreateIShapeProfileDefIfPossible(ExporterIFC exporterIFC, string profileName, CurveLoop curveLoop, Plane origPlane,
XYZ projDir)
{
IFCFile file = exporterIFC.GetFile();
if (curveLoop.IsOpen())
return null;
if (curveLoop.Count() != 12 && curveLoop.Count() != 16)
return null;
// All curves must be lines, except for 4 optional fillets; get direction vectors and start points.
XYZ xDir = origPlane.XVec;
XYZ yDir = origPlane.YVec;
// The list of vertices, in order. startVertex below is the upper-right hand vertex, in UV-space.
IList<UV> vertices = new List<UV>();
// The directions in UV of the line segments. directions[ii] is the direction of the line segment starting with vertex[ii].
IList<UV> directions = new List<UV>();
// The lengths in UV of the line segments. lengths[ii] is the length of the line segment starting with vertex[ii].
IList<double> lengths = new List<double>();
// turnsCCW[ii] is true if directions[ii+1] is clockwise relative to directions[ii] in UV-space.
IList<bool> turnsCCW = new List<bool>();
IList<Arc> fillets = new List<Arc>();
IList<int> filletPositions = new List<int>();
int idx = 0;
int startVertex = -1;
int startFillet = -1;
UV upperRight = null;
double lowerBoundU = 1e+30;
double upperBoundU = -1e+30;
foreach (Curve curve in curveLoop)
{
if (!(curve is Line))
{
if (!(curve is Arc))
return null;
fillets.Add(curve as Arc);
filletPositions.Add(idx); // share the index of the next line segment.
continue;
}
Line line = curve as Line;
XYZ point = line.GetEndPoint(0);
UV pointProjUV = GeometryUtil.ProjectPointToPlane(origPlane, projDir, point);
if (pointProjUV == null)
return null;
pointProjUV = UnitUtil.ScaleLength(pointProjUV);
if ((upperRight == null) || ((pointProjUV.U > upperRight.U - MathUtil.Eps()) && (pointProjUV.V > upperRight.V - MathUtil.Eps())))
{
upperRight = pointProjUV;
startVertex = idx;
startFillet = filletPositions.Count;
}
if (pointProjUV.U < lowerBoundU)
lowerBoundU = pointProjUV.U;
if (pointProjUV.U > upperBoundU)
upperBoundU = pointProjUV.U;
vertices.Add(pointProjUV);
XYZ direction3d = line.Direction;
UV direction = new UV(direction3d.DotProduct(xDir), direction3d.DotProduct(yDir));
lengths.Add(UnitUtil.ScaleLength(line.Length));
bool zeroU = MathUtil.IsAlmostZero(direction.U);
bool zeroV = MathUtil.IsAlmostZero(direction.V);
if (zeroU && zeroV)
return null;
// Accept only non-rotated I-Shapes.
if (!zeroU && !zeroV)
return null;
direction.Normalize();
if (idx > 0)
{
if (!MathUtil.IsAlmostZero(directions[idx - 1].DotProduct(direction)))
return null;
turnsCCW.Add(directions[idx - 1].CrossProduct(direction) > 0);
}
directions.Add(direction);
//.........这里部分代码省略.........
示例2: SafeIsCurveLoopClockwise
/// <returns>true if the curve loop is clockwise, false otherwise.</returns>
private static bool SafeIsCurveLoopClockwise(CurveLoop curveLoop, XYZ dir)
{
if (curveLoop == null)
return false;
if (curveLoop.IsOpen())
return false;
if ((curveLoop.Count() == 1) && !(curveLoop.First().IsBound))
return false;
return !curveLoop.IsCounterclockwise(dir);
}
示例3: CreateCircleProfileDefIfPossible
private static IFCAnyHandle CreateCircleProfileDefIfPossible(ExporterIFC exporterIFC, string profileName, CurveLoop curveLoop, Plane origPlane,
XYZ projDir)
{
IFCFile file = exporterIFC.GetFile();
if (curveLoop.IsOpen())
return null;
XYZ origPlaneNorm = origPlane.Normal;
Plane curveLoopPlane = null;
try
{
curveLoopPlane = curveLoop.GetPlane();
}
catch
{
return null;
}
XYZ curveLoopPlaneNorm = curveLoopPlane.Normal;
if (!MathUtil.IsAlmostEqual(Math.Abs(origPlaneNorm.DotProduct(curveLoopPlaneNorm)), 1.0))
return null;
IList<Arc> arcs = new List<Arc>();
foreach (Curve curve in curveLoop)
{
if (!(curve is Arc))
return null;
arcs.Add(curve as Arc);
}
int numArcs = arcs.Count;
if (numArcs == 0)
return null;
double radius = arcs[0].Radius;
XYZ ctr = arcs[0].Center;
for (int ii = 1; ii < numArcs; ii++)
{
XYZ newCenter = arcs[ii].Center;
if (!newCenter.IsAlmostEqualTo(ctr))
return null;
}
double scale = exporterIFC.LinearScale;
radius *= scale;
XYZ xDir = origPlane.XVec;
XYZ yDir = origPlane.YVec;
XYZ orig = origPlane.Origin;
ctr -= orig;
IList<double> newCtr = new List<double>();
newCtr.Add(xDir.DotProduct(ctr) * scale);
newCtr.Add(yDir.DotProduct(ctr) * scale);
IFCAnyHandle location = IFCInstanceExporter.CreateCartesianPoint(file, newCtr);
IList<double> refDir = new List<double>();
refDir.Add(1.0);
refDir.Add(0.0);
IFCAnyHandle refDirectionOpt = ExporterUtil.CreateDirection(file, refDir);
IFCAnyHandle defPosition = IFCInstanceExporter.CreateAxis2Placement2D(file, location, null, refDirectionOpt);
return IFCInstanceExporter.CreateCircleProfileDef(file, IFCProfileType.Area, profileName, defPosition, radius);
}