本文整理汇总了C#中IFCRange类的典型用法代码示例。如果您正苦于以下问题:C# IFCRange类的具体用法?C# IFCRange怎么用?C# IFCRange使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
IFCRange类属于命名空间,在下文中一共展示了IFCRange类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateExtrusionWithClipping
/// <summary>
/// Creates an extrusion with potential clipping from a list of solids corresponding to an element.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC class.</param>
/// <param name="element">The element.</param>
/// <param name="catId">The category of the element and/or the solid geometry.</param>
/// <param name="solids">The list of solid geometries.</param>
/// <param name="plane">The extrusion base plane.</param>
/// <param name="projDir">The projection direction.</param>
/// <param name="range">The upper and lower limits of the extrusion, in the projection direction.</param>
/// <param name="completelyClipped">Returns true if the extrusion is completely outside the range.</param>
/// <param name="materialIds">The material ids of the solid geometry.</param>
/// <returns>The extrusion handle.</returns>
public static IFCAnyHandle CreateExtrusionWithClipping(ExporterIFC exporterIFC, Element element, ElementId catId,
IList<Solid> solids, Plane plane, XYZ projDir, IFCRange range, out bool completelyClipped, out HashSet<ElementId> materialIds)
{
HandleAndAnalyzer handleAndAnalyzer = CreateExtrusionWithClippingBase(exporterIFC, element, catId,
solids, plane, projDir, range, out completelyClipped, out materialIds);
return handleAndAnalyzer.Handle;
}
示例2: IsWallCompletelyClipped
/// <summary>
/// Checks if the wall is clipped completely.
/// </summary>
/// <param name="exporterIFC">
/// The ExporterIFC object.
/// </param>
/// <param name="wallElement">
/// The wall element.
/// </param>
/// <param name="range">
/// The range of which may clip the wall.
/// </param>
/// <returns>
/// True if the wall is clipped completely, false otherwise.
/// </returns>
static bool IsWallCompletelyClipped(Wall wallElement, ExporterIFC exporterIFC, IFCRange range)
{
return ExporterIFCUtils.IsWallCompletelyClipped(wallElement, exporterIFC, range);
}
示例3: ExportFamilyInstanceAsMappedItem
/// <summary>
/// Exports a family instance as a mapped item.
/// </summary>
/// <param name="exporterIFC">
/// The ExporterIFC object.
/// </param>
/// <param name="familyInstance">
/// The family instance to be exported.
/// </param>
/// <param name="exportType">
/// The export type.
/// </param>
/// <param name="ifcEnumType">
/// The string value represents the IFC type.
/// </param>
/// <param name="wrapper">
/// The ProductWrapper.
/// </param>
/// <param name="overrideLevelId">
/// The level id.
/// </param>
/// <param name="range">
/// The range of this family instance to be exported.
/// </param>
public static void ExportFamilyInstanceAsMappedItem(ExporterIFC exporterIFC,
FamilyInstance familyInstance, IFCExportType exportType, string ifcEnumType,
ProductWrapper wrapper, ElementId overrideLevelId, IFCRange range, IFCAnyHandle parentLocalPlacement)
{
bool exportParts = PartExporter.CanExportParts(familyInstance);
bool isSplit = range != null;
if (exportParts && !PartExporter.CanExportElementInPartExport(familyInstance, isSplit ? overrideLevelId : familyInstance.Level.Id, isSplit))
return;
Document doc = familyInstance.Document;
IFCFile file = exporterIFC.GetFile();
FamilySymbol familySymbol = ExporterIFCUtils.GetOriginalSymbol(familyInstance);
if (familySymbol == null)
return;
ProductWrapper familyProductWrapper = ProductWrapper.Create(wrapper);
double scale = exporterIFC.LinearScale;
Options options = GeometryUtil.GetIFCExportGeometryOptions();
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
HostObject hostElement = familyInstance.Host as HostObject; //hostElement could be null
ElementId categoryId = CategoryUtil.GetSafeCategoryId(familySymbol);
//string emptyString = "";
string familyName = familySymbol.Name;
string objectType = familyName;
// A Family Instance can have its own copy of geometry, or use the symbol's copy with a transform.
// The routine below tells us whether to use the Instance's copy or the Symbol's copy.
bool useInstanceGeometry = ExporterIFCUtils.UsesInstanceGeometry(familyInstance);
IList<IFCExtrusionData> cutPairOpeningsForColumns = new List<IFCExtrusionData>();
using (IFCExtrusionCreationData extraParams = new IFCExtrusionCreationData())
{
Transform trf = familyInstance.GetTransform();
// Extra information if we are exporting a door or a window.
IFCDoorWindowInfo doorWindowInfo = null;
if (exportType == IFCExportType.ExportDoorType)
doorWindowInfo = IFCDoorWindowInfo.CreateDoorInfo(exporterIFC, familyInstance, familySymbol, hostElement, overrideLevelId, trf);
else if (exportType == IFCExportType.ExportWindowType)
doorWindowInfo = IFCDoorWindowInfo.CreateWindowInfo(exporterIFC, familyInstance, familySymbol, hostElement, overrideLevelId, trf);
FamilyTypeInfo typeInfo = new FamilyTypeInfo();
XYZ extraOffset = XYZ.Zero;
bool flipped = doorWindowInfo != null ? doorWindowInfo.IsSymbolFlipped : false;
FamilyTypeInfo currentTypeInfo = ExporterCacheManager.TypeObjectsCache.Find(familySymbol.Id, flipped);
bool found = currentTypeInfo.IsValid();
Family family = familySymbol.Family;
// TODO: this code to be removed by ExtrusionAnalyzer code.
bool trySpecialColumnCreation = ((exportType == IFCExportType.ExportColumnType) && (!family.IsInPlace));
IList<GeometryObject> geomObjects = new List<GeometryObject>();
Transform brepOffsetTransform = null;
Transform doorWindowTrf = Transform.Identity;
// We will create a new mapped type if:
// 1. We are exporting part of a column or in-place wall (range != null), OR
// 2. We are using the instance's copy of the geometry (that it, it has unique geometry), OR
// 3. We haven't already created the type.
bool creatingType = ((range != null) || useInstanceGeometry || !found);
if (creatingType)
{
IFCAnyHandle bodyRepresentation = null;
IFCAnyHandle planRepresentation = null;
// If we are using the instance geometry, ignore the transformation.
if (useInstanceGeometry)
trf = Transform.Identity;
// TODO: this code to be removed by ExtrusionAnalyzer code.
if (trySpecialColumnCreation)
//.........这里部分代码省略.........
示例4: AddClippingsToBaseExtrusion
/// <summary>
/// Processes the geometry of the wall to create an extruded area solid representing the geometry of the wall (including
/// any clippings imposed by neighboring elements).
/// </summary>
/// <param name="exporterIFC">
/// The exporter.
/// </param>
/// <param name="wallElement">
/// The wall.
/// </param>
/// <param name="setterOffset">
/// The offset from the placement setter.
/// </param>
/// <param name="range">
/// The range. This consists of two double values representing the height in Z at the start and the end
/// of the range. If the values are identical the entire wall is used.
/// </param>
/// <param name="zSpan">
/// The overall span in Z of the wall.
/// </param>
/// <param name="baseBodyItemHnd">
/// The IfcExtrudedAreaSolid handle generated initially for the wall.
/// </param>
/// <param name="cutPairOpenings">
/// A collection of extruded openings that can be derived from the wall geometry.
/// </param>
/// <returns>
/// IfcEtxtrudedAreaSolid handle. This may be the same handle as was input, or a modified handle derived from the clipping
/// geometry. If the function fails this handle will have no value.
/// </returns>
static IFCAnyHandle AddClippingsToBaseExtrusion(ExporterIFC exporterIFC, Wall wallElement,
XYZ setterOffset, IFCRange range, IFCRange zSpan, IFCAnyHandle baseBodyItemHnd, out IList<IFCExtrusionData> cutPairOpenings)
{
return ExporterIFCUtils.AddClippingsToBaseExtrusion(exporterIFC, wallElement, setterOffset, range, zSpan, baseBodyItemHnd, out cutPairOpenings);
}
示例5: FallbackTryToCreateAsExtrusion
private static IFCAnyHandle FallbackTryToCreateAsExtrusion(ExporterIFC exporterIFC, Wall wallElement, SolidMeshGeometryInfo smCapsule,
ElementId catId, Curve curve, Plane plane, double depth, IFCRange zSpan, IFCRange range, IFCPlacementSetter setter,
out IList<IFCExtrusionData> cutPairOpenings, out bool isCompletelyClipped)
{
cutPairOpenings = new List<IFCExtrusionData>();
IFCAnyHandle bodyRep;
isCompletelyClipped = false;
XYZ localOrig = plane.Origin;
bool hasExtrusion = HasElevationProfile(wallElement);
if (hasExtrusion)
{
IList<CurveLoop> loops = GetElevationProfile(wallElement);
if (loops.Count == 0)
hasExtrusion = false;
else
{
IList<IList<CurveLoop>> sortedLoops = ExporterIFCUtils.SortCurveLoops(loops);
if (sortedLoops.Count == 0)
return null;
// Current limitation: can't handle wall split into multiple disjointed pieces.
int numSortedLoops = sortedLoops.Count;
if (numSortedLoops > 1)
return null;
bool ignoreExtrusion = true;
bool cantHandle = false;
bool hasGeometry = false;
for (int ii = 0; (ii < numSortedLoops) && !cantHandle; ii++)
{
int sortedLoopSize = sortedLoops[ii].Count;
if (sortedLoopSize == 0)
continue;
if (!ExporterIFCUtils.IsCurveLoopConvexWithOpenings(sortedLoops[ii][0], wallElement, range, out ignoreExtrusion))
{
if (ignoreExtrusion)
{
// we need more information. Is there something to export? If so, we'll
// ignore the extrusion. Otherwise, we will fail.
if (smCapsule.SolidsCount() == 0 && smCapsule.MeshesCount() == 0)
{
continue;
}
}
else
{
cantHandle = true;
}
hasGeometry = true;
}
else
{
hasGeometry = true;
}
}
if (!hasGeometry)
{
isCompletelyClipped = true;
return null;
}
if (cantHandle)
return null;
}
}
if (!CanExportWallGeometryAsExtrusion(wallElement, range))
return null;
// extrusion direction.
XYZ extrusionDir = GetWallHeightDirection(wallElement);
// create extrusion boundary.
IList<CurveLoop> boundaryLoops = new List<CurveLoop>();
bool alwaysThickenCurve = IsWallBaseRectangular(wallElement, curve);
if (!alwaysThickenCurve)
{
boundaryLoops = GetLoopsFromTopBottomFace(wallElement, exporterIFC);
if (boundaryLoops.Count == 0)
return null;
}
else
{
CurveLoop newLoop = CurveLoop.CreateViaThicken(curve, wallElement.Width, XYZ.BasisZ);
if (newLoop == null)
return null;
if (!newLoop.IsCounterclockwise(XYZ.BasisZ))
newLoop = GeometryUtil.ReverseOrientation(newLoop);
boundaryLoops.Add(newLoop);
}
// origin gets scaled later.
//.........这里部分代码省略.........
示例6: GetExtrusionRangeOfCurveLoop
private static IFCRange GetExtrusionRangeOfCurveLoop(CurveLoop loop, XYZ extrusionDirection)
{
IFCRange range = new IFCRange();
bool init = false;
foreach (Curve curve in loop)
{
if (!init)
{
if (curve.IsBound)
{
IList<XYZ> coords = curve.Tessellate();
foreach (XYZ coord in coords)
{
double val = coord.DotProduct(extrusionDirection);
if (!init)
{
range.Start = val;
range.End = val;
init = true;
}
else
{
range.Start = Math.Min(range.Start, val);
range.End = Math.Max(range.End, val);
}
}
}
else
{
double val = curve.get_EndPoint(0).DotProduct(extrusionDirection);
range.Start = val;
range.End = val;
init = true;
}
}
else
{
double val = curve.get_EndPoint(0).DotProduct(extrusionDirection);
range.Start = Math.Min(range.Start, val);
range.End = Math.Max(range.End, val);
}
}
return range;
}
示例7: ProcessClippingFace
// return null if parent should be completely clipped.
// TODO: determine whether or not to use face boundary.
private static IFCAnyHandle ProcessClippingFace(ExporterIFC exporterIFC, CurveLoop outerBoundary, Plane boundaryPlane,
Plane extrusionBasePlane, XYZ extrusionDirection, IFCRange range, bool useFaceBoundary, IFCAnyHandle bodyItemHnd)
{
if (outerBoundary == null || boundaryPlane == null)
throw new Exception("Invalid face boundary.");
double clippingSlant = boundaryPlane.Normal.DotProduct(extrusionDirection);
if (useFaceBoundary)
{
if (MathUtil.IsAlmostZero(clippingSlant))
return bodyItemHnd;
}
bool clipCompletely;
if (!IsInRange(range, outerBoundary, boundaryPlane, extrusionDirection, out clipCompletely))
return clipCompletely ? null : bodyItemHnd;
if (MathUtil.IsAlmostZero(clippingSlant))
throw new Exception("Can't create clipping perpendicular to extrusion.");
IFCFile file = exporterIFC.GetFile();
XYZ scaledOrig = ExporterIFCUtils.TransformAndScalePoint(exporterIFC, boundaryPlane.Origin);
XYZ scaledNorm = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, boundaryPlane.Normal);
XYZ scaledXDir = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, boundaryPlane.XVec);
IFCAnyHandle planeAxisHnd = ExporterUtil.CreateAxis(file, scaledOrig, scaledNorm, scaledXDir);
IFCAnyHandle surfHnd = IFCInstanceExporter.CreatePlane(file, planeAxisHnd);
IFCAnyHandle clippedBodyItemHnd = null;
IFCAnyHandle halfSpaceHnd = null;
if (useFaceBoundary)
{
IFCAnyHandle boundedCurveHnd;
if (boundaryPlane != null)
{
XYZ projScaledOrigin = ExporterIFCUtils.TransformAndScalePoint(exporterIFC, extrusionBasePlane.Origin);
XYZ projScaledX = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, extrusionBasePlane.XVec);
XYZ projScaledY= ExporterIFCUtils.TransformAndScaleVector(exporterIFC, extrusionBasePlane.YVec);
XYZ projScaledNorm = projScaledX.CrossProduct(projScaledY);
Plane projScaledPlane = new Plane(projScaledX, projScaledY, projScaledOrigin);
IList<UV> polylinePts = TransformAndProjectCurveLoopToPlane(exporterIFC, outerBoundary, projScaledPlane);
polylinePts.Add(polylinePts[0]);
boundedCurveHnd = ExporterUtil.CreatePolyline(file, polylinePts);
IFCAnyHandle boundedAxisHnd = ExporterUtil.CreateAxis(file, projScaledOrigin, projScaledNorm, projScaledX);
halfSpaceHnd = IFCInstanceExporter.CreatePolygonalBoundedHalfSpace(file, boundedAxisHnd, boundedCurveHnd, surfHnd, false);
}
else
{
throw new Exception("Can't create non-polygonal face boundary.");
}
}
else
{
halfSpaceHnd = IFCInstanceExporter.CreateHalfSpaceSolid(file, surfHnd, false);
}
if (halfSpaceHnd == null)
throw new Exception("Can't create clipping.");
clippedBodyItemHnd = IFCInstanceExporter.CreateBooleanClippingResult(file, IFCBooleanOperator.Difference,
bodyItemHnd, halfSpaceHnd);
return clippedBodyItemHnd;
}
示例8: WallHasGeometryToExport
private static bool WallHasGeometryToExport(Wall wallElement,
IList<Solid> solids,
IList<Mesh> meshes,
IFCRange range,
out bool isCompletelyClipped)
{
isCompletelyClipped = false;
bool hasExtrusion = HasElevationProfile(wallElement);
if (hasExtrusion)
{
IList<CurveLoop> loops = GetElevationProfile(wallElement);
if (loops.Count == 0)
hasExtrusion = false;
else
{
IList<IList<CurveLoop>> sortedLoops = ExporterIFCUtils.SortCurveLoops(loops);
if (sortedLoops.Count == 0)
return false;
// Current limitation: can't handle wall split into multiple disjointed pieces.
int numSortedLoops = sortedLoops.Count;
if (numSortedLoops > 1)
return false;
bool ignoreExtrusion = true;
bool cantHandle = false;
bool hasGeometry = false;
for (int ii = 0; (ii < numSortedLoops) && !cantHandle; ii++)
{
int sortedLoopSize = sortedLoops[ii].Count;
if (sortedLoopSize == 0)
continue;
if (!ExporterIFCUtils.IsCurveLoopConvexWithOpenings(sortedLoops[ii][0], wallElement, range, out ignoreExtrusion))
{
if (ignoreExtrusion)
{
// we need more information. Is there something to export? If so, we'll
// ignore the extrusion. Otherwise, we will fail.
if (solids.Count == 0 && meshes.Count == 0)
continue;
}
else
{
cantHandle = true;
}
hasGeometry = true;
}
else
{
hasGeometry = true;
}
}
if (!hasGeometry)
{
isCompletelyClipped = true;
return false;
}
if (cantHandle)
return false;
}
}
return true;
}
示例9: TryToCreateAsExtrusion
private static IFCAnyHandle TryToCreateAsExtrusion(ExporterIFC exporterIFC,
Wall wallElement,
IList<IList<IFCConnectedWallData>> connectedWalls,
IList<Solid> solids,
IList<Mesh> meshes,
double baseWallElevation,
ElementId catId,
Curve baseCurve,
Curve trimmedCurve,
Plane wallLCS,
double scaledDepth,
IFCRange zSpan,
IFCRange range,
PlacementSetter setter,
out IList<IFCExtrusionData> cutPairOpenings,
out bool isCompletelyClipped,
out double scaledFootprintArea,
out double scaledLength)
{
cutPairOpenings = new List<IFCExtrusionData>();
IFCAnyHandle bodyRep;
scaledFootprintArea = 0;
double unscaledLength = trimmedCurve != null ? trimmedCurve.Length : 0;
scaledLength = UnitUtil.ScaleLength(unscaledLength);
XYZ localOrig = wallLCS.Origin;
// Check to see if the wall has geometry given the specified range.
if (!WallHasGeometryToExport(wallElement, solids, meshes, range, out isCompletelyClipped))
return null;
// This is our major check here that goes into internal code. If we have enough information to faithfully reproduce
// the wall as an extrusion with clippings and openings, we will continue. Otherwise, export it as a BRep.
if (!CanExportWallGeometryAsExtrusion(wallElement, range))
return null;
// extrusion direction.
XYZ extrusionDir = GetWallHeightDirection(wallElement);
// create extrusion boundary.
bool alwaysThickenCurve = IsWallBaseRectangular(wallElement, trimmedCurve);
double unscaledWidth = wallElement.Width;
IList<CurveLoop> boundaryLoops = GetBoundaryLoopsFromWall(exporterIFC, wallElement, alwaysThickenCurve, trimmedCurve, unscaledWidth);
if (boundaryLoops == null || boundaryLoops.Count == 0)
return null;
double fullUnscaledLength = baseCurve.Length;
double unscaledFootprintArea = ExporterIFCUtils.ComputeAreaOfCurveLoops(boundaryLoops);
scaledFootprintArea = UnitUtil.ScaleArea(unscaledFootprintArea);
// We are going to do a little sanity check here. If the scaledFootprintArea is significantly less than the
// width * length of the wall footprint, we probably calculated the area wrong, and will abort.
// This could occur because of a door or window that cuts a corner of the wall (i.e., has no wall material on one side).
// We want the scaledFootprintArea to be at least (95% of approximateBaseArea - 2 * side wall area).
// The "side wall area" is an approximate value that takes into account potential wall joins.
// This prevents us from doing extra work for many small walls because of joins. We'll allow 1' (~30 cm) per side for this.
double approximateUnscaledBaseArea = unscaledWidth * fullUnscaledLength;
if (unscaledFootprintArea < (approximateUnscaledBaseArea * .95 - 2 * unscaledWidth))
{
// Can't handle the case where we don't have a simple extrusion to begin with.
if (!alwaysThickenCurve)
return null;
boundaryLoops = GetBoundaryLoopsFromBaseCurve(wallElement, connectedWalls, baseCurve, trimmedCurve, unscaledWidth, scaledDepth);
if (boundaryLoops == null || boundaryLoops.Count == 0)
return null;
}
// origin gets scaled later.
double baseWallZOffset = localOrig[2] - ((range == null) ? baseWallElevation : Math.Min(range.Start, baseWallElevation));
XYZ modifiedSetterOffset = new XYZ(0, 0, setter.Offset + baseWallZOffset);
IFCAnyHandle baseBodyItemHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, null, boundaryLoops, wallLCS,
extrusionDir, scaledDepth);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(baseBodyItemHnd))
return null;
IFCAnyHandle bodyItemHnd = AddClippingsToBaseExtrusion(exporterIFC, wallElement,
modifiedSetterOffset, range, zSpan, baseBodyItemHnd, out cutPairOpenings);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyItemHnd))
return null;
bool hasClipping = bodyItemHnd.Id != baseBodyItemHnd.Id;
ElementId matId = HostObjectExporter.GetFirstLayerMaterialId(wallElement);
IFCAnyHandle styledItemHnd = BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, wallElement.Document,
baseBodyItemHnd, matId);
HashSet<IFCAnyHandle> bodyItems = new HashSet<IFCAnyHandle>();
bodyItems.Add(bodyItemHnd);
// Check whether wall has opening. If it has, exporting it in the Reference View will need to be in a tessellated geometry that includes the opening cut
IList<IFCOpeningData> openingDataList = ExporterIFCUtils.GetOpeningData(exporterIFC, wallElement, wallLCS, range);
bool wallHasOpening = openingDataList.Count > 0;
BodyExporterOptions options = new BodyExporterOptions(true);
IFCAnyHandle contextOfItemsBody = exporterIFC.Get3DContextHandle("Body");
if (!hasClipping)
{
//.........这里部分代码省略.........
示例10: GetBestMaterialIdForGeometry
/// <summary>
/// Gets the best material id for the geometry.
/// </summary>
/// <param name="geometryElement">The geometry object to get the best material id.</param>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="range">The range to get the clipped geometry.</param>
/// <returns>The material id.</returns>
public static ElementId GetBestMaterialIdForGeometry(GeometryElement geometryElement,
ExporterIFC exporterIFC, IFCRange range)
{
SolidMeshGeometryInfo solidMeshCapsule = null;
if (range == null)
{
solidMeshCapsule = GeometryUtil.GetSolidMeshGeometry(geometryElement, Transform.Identity);
}
else
{
solidMeshCapsule = GeometryUtil.GetClippedSolidMeshGeometry(geometryElement, range);
}
IList<Solid> solids = solidMeshCapsule.GetSolids();
IList<Mesh> polyMeshes = solidMeshCapsule.GetMeshes();
ElementId id = GetBestMaterialIdForGeometry(solids, polyMeshes);
return id;
}
示例11: ExportDummyWall
/// <summary>
/// Export the dummy wall to host an orphan part. It usually happens in the cases of associated parts are higher than split sub-wall.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="element">The wall element.</param>
/// <param name="geometryElement">The geometry of wall.</param>
/// <param name="origWrapper">The ProductWrapper.</param>
/// <param name="overrideLevelId">The ElementId that will crate the dummy wall.</param>
/// <param name="range">The IFCRange corresponding to the dummy wall.</param>
/// <returns>The handle of dummy wall.</returns>
public static IFCAnyHandle ExportDummyWall(ExporterIFC exporterIFC, Element element, GeometryElement geometryElement,
ProductWrapper origWrapper, ElementId overrideLevelId, IFCRange range)
{
using (ProductWrapper localWrapper = ProductWrapper.Create(origWrapper))
{
ElementId catId = CategoryUtil.GetSafeCategoryId(element);
Wall wallElement = element as Wall;
if (wallElement == null)
return null;
if (wallElement != null && IsWallCompletelyClipped(wallElement, exporterIFC, range))
return null;
// get global values.
Document doc = element.Document;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
bool validRange = (range != null && !MathUtil.IsAlmostZero(range.Start - range.End));
bool exportParts = PartExporter.CanExportParts(wallElement);
if (exportParts && !PartExporter.CanExportElementInPartExport(wallElement, validRange ? overrideLevelId : wallElement.LevelId, validRange))
return null;
string objectType = NamingUtil.CreateIFCObjectName(exporterIFC, element);
IFCAnyHandle wallHnd = null;
string elemGUID = null;
int subElementIndex = ExporterStateManager.GetCurrentRangeIndex();
if (subElementIndex == 0)
elemGUID = GUIDUtil.CreateGUID(element);
else if (subElementIndex <= ExporterStateManager.RangeIndexSetter.GetMaxStableGUIDs())
elemGUID = GUIDUtil.CreateSubElementGUID(element, subElementIndex + (int)IFCGenericSubElements.SplitInstanceStart - 1);
else
elemGUID = GUIDUtil.CreateGUID();
string elemName = NamingUtil.GetNameOverride(element, NamingUtil.GetIFCName(element));
string elemDesc = NamingUtil.GetDescriptionOverride(element, null);
string elemObjectType = NamingUtil.GetObjectTypeOverride(element, objectType);
string elemTag = NamingUtil.GetTagOverride(element, NamingUtil.CreateIFCElementId(element));
Transform orientationTrf = Transform.Identity;
using (PlacementSetter setter = PlacementSetter.Create(exporterIFC, element, null, orientationTrf, overrideLevelId))
{
IFCAnyHandle localPlacement = setter.LocalPlacement;
wallHnd = IFCInstanceExporter.CreateWall(file, elemGUID, ownerHistory, elemName, elemDesc, elemObjectType,
localPlacement, null, elemTag, "NOTDEFINED");
if (exportParts)
PartExporter.ExportHostPart(exporterIFC, element, wallHnd, localWrapper, setter, localPlacement, overrideLevelId);
IFCExtrusionCreationData extraParams = new IFCExtrusionCreationData();
extraParams.PossibleExtrusionAxes = IFCExtrusionAxes.TryZ; // only allow vertical extrusions!
extraParams.AreInnerRegionsOpenings = true;
localWrapper.AddElement(element, wallHnd, setter, extraParams, true);
ElementId wallLevelId = (validRange) ? setter.LevelId : ElementId.InvalidElementId;
SpaceBoundingElementUtil.RegisterSpaceBoundingElementHandle(exporterIFC, wallHnd, element.Id, wallLevelId);
}
return wallHnd;
}
}
示例12: SplitParts
/// <summary>
/// Split associated parts when host element is split by level.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="hostElement">The host element havign associtaed parts.</param>
/// <param name="associatedPartsList">The list of associtated parts.</param>
private static void SplitParts(ExporterIFC exporterIFC, Element hostElement, List<ElementId> associatedPartsList)
{
string ifcEnumType;
IFCExportType exportType = ExporterUtil.GetExportType(exporterIFC, hostElement, out ifcEnumType);
// Split the host to find the orphan parts.
IList<ElementId> orphanLevels = new List<ElementId>();
IList<ElementId> hostLevels = new List<ElementId>();
IList<IFCRange> hostRanges = new List<IFCRange>();
LevelUtil.CreateSplitLevelRangesForElement(exporterIFC, exportType, hostElement, out hostLevels, out hostRanges);
orphanLevels = hostLevels;
// Split each Parts
IList<ElementId> levels = new List<ElementId>();
IList<IFCRange> ranges = new List<IFCRange>();
// Dictionary to storage the level and its parts.
Dictionary<ElementId, List<KeyValuePair<Part, IFCRange>>> levelParts = new Dictionary<ElementId, List<KeyValuePair<Part, IFCRange>>>();
foreach (ElementId partId in associatedPartsList)
{
Part part = hostElement.Document.GetElement(partId) as Part;
LevelUtil.CreateSplitLevelRangesForElement(exporterIFC, exportType, part, out levels, out ranges);
// if the parts are above top level, associate them with nearest bottom level.
if (ranges.Count == 0)
{
ElementId bottomLevelId = FindPartSplitLevel(exporterIFC, part);
if (bottomLevelId == ElementId.InvalidElementId && part.Level != null)
bottomLevelId = part.Level.Id;
if (!levelParts.ContainsKey(bottomLevelId))
levelParts.Add(bottomLevelId, new List<KeyValuePair<Part, IFCRange>>());
KeyValuePair<Part, IFCRange> splitPartRange = new KeyValuePair<Part, IFCRange>(part, null);
levelParts[bottomLevelId].Add(splitPartRange);
continue;
}
// The parts split by levels are stored in dictionary.
for (int ii = 0; ii < ranges.Count; ii++)
{
if (!levelParts.ContainsKey(levels[ii]))
levelParts.Add(levels[ii], new List<KeyValuePair<Part, IFCRange>>());
KeyValuePair<Part, IFCRange> splitPartRange = new KeyValuePair<Part, IFCRange>(part, ranges[ii]);
levelParts[levels[ii]].Add(splitPartRange);
}
if (levels.Count > hostLevels.Count)
{
orphanLevels = orphanLevels.Union<ElementId>(levels).ToList();
}
}
ExporterCacheManager.HostPartsCache.Register(hostElement.Id, levelParts);
// The levels of orphan part.
orphanLevels = orphanLevels.Where(number => !hostLevels.Contains(number)).ToList();
List<KeyValuePair<ElementId, IFCRange>> levelRangePairList = new List<KeyValuePair<ElementId, IFCRange>>();
foreach (ElementId orphanLevelId in orphanLevels)
{
IFCLevelInfo levelInfo = ExporterCacheManager.LevelInfoCache.GetLevelInfo(exporterIFC, orphanLevelId);
if (levelInfo == null)
continue;
double levelHeight = ExporterCacheManager.LevelInfoCache.FindHeight(orphanLevelId);
IFCRange levelRange = new IFCRange(levelInfo.Elevation, levelInfo.Elevation + levelHeight);
List<KeyValuePair<Part, IFCRange>> splitPartRangeList = new List<KeyValuePair<Part, IFCRange>>();
splitPartRangeList = ExporterCacheManager.HostPartsCache.Find(hostElement.Id, orphanLevelId);
IFCRange highestRange = levelRange;
foreach (KeyValuePair<Part, IFCRange> partRange in splitPartRangeList)
{
if (partRange.Value.End > highestRange.End)
{
highestRange = partRange.Value;
}
}
levelRangePairList.Add(new KeyValuePair<ElementId, IFCRange>(orphanLevelId, highestRange));
}
if (levelRangePairList.Count > 0)
{
ExporterCacheManager.DummyHostCache.Register(hostElement.Id, levelRangePairList);
}
}
示例13: ExportPart
/// <summary>
/// Export the individual part (IfcBuildingElementPart).
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="partElement">The part element to export.</param>
/// <param name="geometryElement">The geometry of part.</param>
/// <param name="productWrapper">The IFCProductWrapper object.</param>
public static void ExportPart(ExporterIFC exporterIFC, Element partElement, IFCProductWrapper productWrapper,
IFCPlacementSetter placementSetter, IFCAnyHandle originalPlacement, IFCRange range, IFCExtrusionAxes ifcExtrusionAxes,
Element hostElement, ElementId overrideLevelId, bool asBuildingElement)
{
if (!ElementFilteringUtil.IsElementVisible(ExporterCacheManager.ExportOptionsCache.FilterViewForExport, partElement))
return;
Part part = partElement as Part;
if (part == null)
return;
IFCPlacementSetter standalonePlacementSetter = null;
bool standaloneExport = hostElement == null && !asBuildingElement;
ElementId partExportLevel = null;
if (standaloneExport || asBuildingElement)
{
if (partElement.Level != null)
partExportLevel = partElement.Level.Id;
}
else
{
if (part.OriginalCategoryId != hostElement.Category.Id)
return;
partExportLevel = hostElement.Level.Id;
}
if (overrideLevelId != null)
partExportLevel = overrideLevelId;
if (ExporterCacheManager.PartExportedCache.HasExported(partElement.Id, partExportLevel))
return;
Options options = GeometryUtil.GetIFCExportGeometryOptions();
View ownerView = partElement.Document.GetElement(partElement.OwnerViewId) as View;
if (ownerView != null)
options.View = ownerView;
GeometryElement geometryElement = partElement.get_Geometry(options);
if (geometryElement == null)
return;
try
{
IFCFile file = exporterIFC.GetFile();
using (IFCTransaction transaction = new IFCTransaction(file))
{
IFCAnyHandle partPlacement = null;
if (standaloneExport || asBuildingElement)
{
Transform orientationTrf = Transform.Identity;
standalonePlacementSetter = IFCPlacementSetter.Create(exporterIFC, partElement, null, orientationTrf, partExportLevel);
partPlacement = standalonePlacementSetter.GetPlacement();
}
else
partPlacement = ExporterUtil.CopyLocalPlacement(file, originalPlacement);
bool validRange = (range != null && !MathUtil.IsAlmostZero(range.Start - range.End));
SolidMeshGeometryInfo solidMeshInfo;
if (validRange)
{
solidMeshInfo = GeometryUtil.GetClippedSolidMeshGeometry(geometryElement, range);
if (solidMeshInfo.GetSolids().Count == 0 && solidMeshInfo.GetMeshes().Count == 0)
return;
}
else
{
solidMeshInfo = GeometryUtil.GetSolidMeshGeometry(geometryElement, Transform.Identity);
}
using (IFCExtrusionCreationData extrusionCreationData = new IFCExtrusionCreationData())
{
extrusionCreationData.SetLocalPlacement(partPlacement);
extrusionCreationData.ReuseLocalPlacement = false;
extrusionCreationData.PossibleExtrusionAxes = ifcExtrusionAxes;
IList<Solid> solids = solidMeshInfo.GetSolids();
IList<Mesh> meshes = solidMeshInfo.GetMeshes();
ElementId catId = CategoryUtil.GetSafeCategoryId(partElement);
BodyData bodyData = null;
BodyExporterOptions bodyExporterOptions = new BodyExporterOptions(true);
if (solids.Count > 0 || meshes.Count > 0)
{
bodyData = BodyExporter.ExportBody(partElement.Document.Application, exporterIFC, partElement, catId, solids, meshes,
bodyExporterOptions, extrusionCreationData);
}
else
{
IList<GeometryObject> geomlist = new List<GeometryObject>();
geomlist.Add(geometryElement);
bodyData = BodyExporter.ExportBody(partElement.Document.Application, exporterIFC, partElement, catId, geomlist,
//.........这里部分代码省略.........
示例14: CreateExtrusionWithClippingAndProperties
/// <summary>
/// Creates an extrusion with potential clipping from a solid corresponding to an element, and supplies ExtrusionCreationData for the result.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC class.</param>
/// <param name="element">The element.</param>
/// <param name="catId">The category of the element and/or the solid geometry.</param>
/// <param name="solid">The solid geometry.</param>
/// <param name="plane">The extrusion base plane.</param>
/// <param name="projDir">The projection direction.</param>
/// <param name="range">The upper and lower limits of the extrusion, in the projection direction.</param>
/// <param name="completelyClipped">Returns true if the extrusion is completely outside the range.</param>
/// <returns>The extrusion handle.</returns>
public static HandleAndData CreateExtrusionWithClippingAndProperties(ExporterIFC exporterIFC,
Element element, ElementId catId, Solid solid, Plane plane, XYZ projDir, IFCRange range, out bool completelyClipped)
{
IList<Solid> solids = new List<Solid>();
solids.Add(solid);
HashSet<ElementId> materialIds = null;
HandleAndAnalyzer handleAndAnalyzer = CreateExtrusionWithClippingBase(exporterIFC, element, catId,
solids, plane, projDir, range, out completelyClipped, out materialIds);
HandleAndData ret = new HandleAndData();
ret.Handle = handleAndAnalyzer.Handle;
ret.BaseExtrusions = handleAndAnalyzer.BaseExtrusions;
ret.ShapeRepresentationType = handleAndAnalyzer.ShapeRepresentationType;
ret.MaterialIds = materialIds;
if (handleAndAnalyzer.Analyzer != null)
ret.Data = GetExtrusionCreationDataFromAnalyzer(exporterIFC, projDir, handleAndAnalyzer.Analyzer);
return ret;
}
示例15: GetClippedSolidMeshGeometry
/// <summary>
/// Collects all meshes within a GeometryElement and all solids clipped between a given IFCRange.
/// </summary>
/// <remarks>
/// Added in 2013 to replace the temporary API method ExporterIFCUtils.GetClippedSolidMeshGeometry.
/// </remarks>
/// <param name="elem">
/// The Element from which we can obtain a bounding box. Not handled directly in this method, it is used in an internal helper method.
/// </param>
/// <param name="geomElemToUse">
/// The GeometryElement.
/// </param>
/// <param name="range">
/// The upper and lower levels which act as the clipping boundaries.
/// </param>
/// <returns>The collection of solids and meshes.</returns>
public static SolidMeshGeometryInfo GetClippedSolidMeshGeometry(GeometryElement geomElemToUse, IFCRange range)
{
SolidMeshGeometryInfo geometryInfo = GetSolidMeshGeometry(geomElemToUse, Transform.Identity);
geometryInfo.ClipSolidsList(geomElemToUse, range);
return geometryInfo;
}