本文整理汇总了C#中ExporterIFC.Get3DContextHandle方法的典型用法代码示例。如果您正苦于以下问题:C# ExporterIFC.Get3DContextHandle方法的具体用法?C# ExporterIFC.Get3DContextHandle怎么用?C# ExporterIFC.Get3DContextHandle使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ExporterIFC
的用法示例。
在下文中一共展示了ExporterIFC.Get3DContextHandle方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: CreateOpeningsIfNecessaryBase
/// <summary>
/// Creates openings if there is necessary.
/// </summary>
/// <param name="elementHandle">The element handle to create openings.</param>
/// <param name="element">The element to create openings.</param>
/// <param name="info">The extrusion data.</param>
/// <param name="extraParams">The extrusion creation data.</param>
/// <param name="offsetTransform">The offset transform from ExportBody, or the identity transform.</param>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="originalPlacement">The original placement handle.</param>
/// <param name="setter">The PlacementSetter.</param>
/// <param name="wrapper">The ProductWrapper.</param>
private static void CreateOpeningsIfNecessaryBase(IFCAnyHandle elementHandle, Element element, IList<IFCExtrusionData> info,
IFCExtrusionCreationData extraParams, Transform offsetTransform, ExporterIFC exporterIFC,
IFCAnyHandle originalPlacement, PlacementSetter setter, ProductWrapper wrapper)
{
if (IFCAnyHandleUtil.IsNullOrHasNoValue(elementHandle))
return;
int sz = info.Count;
if (sz == 0)
return;
using (TransformSetter transformSetter = TransformSetter.Create())
{
if (offsetTransform != null)
transformSetter.Initialize(exporterIFC, offsetTransform.Inverse);
IFCFile file = exporterIFC.GetFile();
ElementId categoryId = CategoryUtil.GetSafeCategoryId(element);
Document document = element.Document;
string openingObjectType = "Opening";
int openingNumber = 1;
for (int curr = info.Count - 1; curr >= 0; curr--)
{
IFCAnyHandle extrusionHandle = ExtrusionExporter.CreateExtrudedSolidFromExtrusionData(exporterIFC, element, info[curr]);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(extrusionHandle))
continue;
IFCAnyHandle styledItemHnd = BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document,
extrusionHandle, ElementId.InvalidElementId);
HashSet<IFCAnyHandle> bodyItems = new HashSet<IFCAnyHandle>();
bodyItems.Add(extrusionHandle);
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("Body");
IFCAnyHandle bodyRep = RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, categoryId, contextOfItems, bodyItems, null);
IList<IFCAnyHandle> representations = new List<IFCAnyHandle>();
representations.Add(bodyRep);
IFCAnyHandle openingRep = IFCInstanceExporter.CreateProductDefinitionShape(file, null, null, representations);
IFCAnyHandle openingPlacement = ExporterUtil.CopyLocalPlacement(file, originalPlacement);
string guid = GUIDUtil.CreateGUID();
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
string openingName = NamingUtil.GetIFCNamePlusIndex(element, openingNumber++);
string elementId = NamingUtil.CreateIFCElementId(element);
IFCAnyHandle openingElement = IFCInstanceExporter.CreateOpeningElement(file, guid, ownerHistory,
openingName, null, openingObjectType, openingPlacement, openingRep, elementId);
wrapper.AddElement(null, openingElement, setter, extraParams, true);
if (ExporterCacheManager.ExportOptionsCache.ExportBaseQuantities && (extraParams != null))
PropertyUtil.CreateOpeningQuantities(exporterIFC, openingElement, extraParams);
string voidGuid = GUIDUtil.CreateGUID();
IFCInstanceExporter.CreateRelVoidsElement(file, voidGuid, ownerHistory, null, null, elementHandle, openingElement);
}
}
}
示例2: ExportSurface
/// <summary>
/// Exports a geometry element to boundary representation.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="element">The element.</param>
/// <param name="geometryElement">The geometry element.</param>
/// <param name="exportBoundaryRep">True if to export boundary representation.</param>
/// <param name="exportAsFacetation">True if to export the geometry as facetation.</param>
/// <param name="bodyRep">Body representation.</param>
/// <param name="boundaryRep">Boundary representation.</param>
/// <returns>True if success, false if fail.</returns>
public static bool ExportSurface(ExporterIFC exporterIFC, Element element, GeometryElement geometryElement,
bool exportBoundaryRep, bool exportAsFacetation, ref IFCAnyHandle bodyRep, ref IFCAnyHandle boundaryRep)
{
if (geometryElement == null)
return false;
IFCGeometryInfo ifcGeomInfo = null;
Document doc = element.Document;
Plane plane = GeometryUtil.CreateDefaultPlane();
XYZ projDir = new XYZ(0, 0, 1);
double eps = doc.Application.VertexTolerance * exporterIFC.LinearScale;
ifcGeomInfo = IFCGeometryInfo.CreateFaceGeometryInfo(exporterIFC, plane, projDir, eps, exportBoundaryRep);
ExporterIFCUtils.CollectGeometryInfo(exporterIFC, ifcGeomInfo, geometryElement, XYZ.Zero, true);
IFCFile file = exporterIFC.GetFile();
HashSet<IFCAnyHandle> faceSets = new HashSet<IFCAnyHandle>();
IList<ICollection<IFCAnyHandle>> faceList = ifcGeomInfo.GetFaces();
foreach (ICollection<IFCAnyHandle> faces in faceList)
{
// no faces, don't complain.
if (faces.Count == 0)
continue;
HashSet<IFCAnyHandle> faceSet = new HashSet<IFCAnyHandle>(faces);
faceSets.Add(IFCInstanceExporter.CreateConnectedFaceSet(file, faceSet));
}
if (faceSets.Count == 0)
return false;
IFCAnyHandle surface = IFCInstanceExporter.CreateFaceBasedSurfaceModel(file, faceSets);
BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, doc, surface, BodyExporter.GetBestMaterialIdFromGeometryOrParameter(geometryElement, exporterIFC, element));
IList<IFCAnyHandle> surfaceItems = new List<IFCAnyHandle>();
surfaceItems.Add(surface);
ElementId catId = CategoryUtil.GetSafeCategoryId(element);
bodyRep = RepresentationUtil.CreateSurfaceRep(exporterIFC, element, catId, exporterIFC.Get3DContextHandle("Body"), surfaceItems,
exportAsFacetation, bodyRep);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyRep))
return false;
ICollection<IFCAnyHandle> boundaryRepresentations = ifcGeomInfo.GetRepresentations();
if (exportBoundaryRep && boundaryRepresentations.Count > 0)
{
boundaryRep = RepresentationUtil.CreateBoundaryRep(exporterIFC, element, catId, exporterIFC.Get3DContextHandle("FootPrint"), boundaryRepresentations,
boundaryRep);
}
return true;
}
示例3: ExportBoundingBoxBase
private static IFCAnyHandle ExportBoundingBoxBase(ExporterIFC exporterIFC, XYZ cornerXYZ, double xDim, double yDim, double zDim)
{
double eps = MathUtil.Eps();
if (xDim < eps || yDim < eps || zDim < eps)
return null;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle cornerHnd = ExporterUtil.CreateCartesianPoint(file, cornerXYZ);
IFCAnyHandle boundingBoxItem = IFCInstanceExporter.CreateBoundingBox(file, cornerHnd, xDim, yDim, zDim);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(boundingBoxItem))
return null;
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("Box");
return RepresentationUtil.CreateBoundingBoxRep(exporterIFC, contextOfItems, boundingBoxItem);
}
示例4: ExportStairsAsContainer
/// <summary>
/// Exports a staircase to IfcStair, composing into separate runs and landings.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="ifcEnumType">The stairs type.</param>
/// <param name="stair">The stairs element.</param>
/// <param name="geometryElement">The geometry element.</param>
/// <param name="numFlights">The number of flights for a multistory staircase.</param>
/// <param name="productWrapper">The IFCProductWrapper.</param>
public static void ExportStairsAsContainer(ExporterIFC exporterIFC, string ifcEnumType, Stairs stair, GeometryElement geometryElement,
int numFlights, IFCProductWrapper productWrapper)
{
if (stair == null || geometryElement == null)
return;
Document doc = stair.Document;
Autodesk.Revit.ApplicationServices.Application app = doc.Application;
IFCFile file = exporterIFC.GetFile();
Options geomOptions = GeometryUtil.GetIFCExportGeometryOptions();
ElementId categoryId = CategoryUtil.GetSafeCategoryId(stair);
using (IFCTransaction tr = new IFCTransaction(file))
{
using (IFCPlacementSetter placementSetter = IFCPlacementSetter.Create(exporterIFC, stair))
{
HashSet<ElementId> materialIds = new HashSet<ElementId>();
List<IFCAnyHandle> componentHandles = new List<IFCAnyHandle>();
IList<IFCExtrusionCreationData> componentExtrusionData = new List<IFCExtrusionCreationData>();
IFCAnyHandle contextOfItemsFootPrint = exporterIFC.Get3DContextHandle("FootPrint");
Transform trf = ExporterIFCUtils.GetUnscaledTransform(exporterIFC, placementSetter.GetPlacement());
Plane boundaryPlane = new Plane(trf.BasisX, trf.BasisY, trf.Origin);
XYZ boundaryProjDir = trf.BasisZ;
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
string stairGUID = ExporterIFCUtils.CreateGUID(stair);
string origStairName = exporterIFC.GetName();
string stairName = NamingUtil.GetNameOverride(stair, origStairName);
string stairDescription = NamingUtil.GetDescriptionOverride(stair, null);
string stairObjectType = NamingUtil.GetObjectTypeOverride(stair, NamingUtil.CreateIFCObjectName(exporterIFC, stair));
IFCAnyHandle stairLocalPlacement = placementSetter.GetPlacement();
string stairElementTag = NamingUtil.CreateIFCElementId(stair);
IFCStairType stairType = GetIFCStairType(ifcEnumType);
IFCAnyHandle stairContainerHnd = IFCInstanceExporter.CreateStair(file, stairGUID, ownerHistory, stairName,
stairDescription, stairObjectType, stairLocalPlacement, null, stairElementTag, stairType);
productWrapper.AddElement(stairContainerHnd, placementSetter.GetLevelInfo(), null, LevelUtil.AssociateElementToLevel(stair));
// Get List of runs to export their geometry.
ICollection<ElementId> runIds = stair.GetStairsRuns();
int index = 0;
foreach (ElementId runId in runIds)
{
index++;
StairsRun run = doc.GetElement(runId) as StairsRun;
using (IFCExtrusionCreationData ecData = new IFCExtrusionCreationData())
{
ecData.AllowVerticalOffsetOfBReps = false;
ecData.SetLocalPlacement(placementSetter.GetPlacement());
ecData.ReuseLocalPlacement = false;
GeometryElement runGeometryElement = run.get_Geometry(geomOptions);
BodyExporterOptions bodyExporterOptions = new BodyExporterOptions(true);
BodyData bodyData = BodyExporter.ExportBody(app, exporterIFC, run, categoryId, runGeometryElement,
bodyExporterOptions, ecData);
IFCAnyHandle bodyRep = bodyData.RepresentationHnd;
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyRep))
{
ecData.ClearOpenings();
continue;
}
foreach (ElementId materialId in bodyData.MaterialIds)
materialIds.Add(materialId);
IList<IFCAnyHandle> reps = new List<IFCAnyHandle>();
reps.Add(bodyRep);
Transform runBoundaryTrf = trf.Multiply(bodyData.BrepOffsetTransform);
Plane runBoundaryPlane = new Plane(runBoundaryTrf.BasisX, runBoundaryTrf.BasisY, runBoundaryTrf.Origin);
XYZ runBoundaryProjDir = runBoundaryTrf.BasisZ;
CurveLoop boundary = run.GetFootprintBoundary();
IFCAnyHandle boundaryHnd = ExporterIFCUtils.CreateCurveFromCurveLoop(exporterIFC, boundary,
runBoundaryPlane, runBoundaryProjDir);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(boundaryHnd))
{
HashSet<IFCAnyHandle> geomSelectSet = new HashSet<IFCAnyHandle>();
geomSelectSet.Add(boundaryHnd);
HashSet<IFCAnyHandle> boundaryItems = new HashSet<IFCAnyHandle>();
boundaryItems.Add(IFCInstanceExporter.CreateGeometricSet(file, geomSelectSet));
IFCAnyHandle boundaryRep = RepresentationUtil.CreateGeometricSetRep(exporterIFC, run, categoryId, "FootPrint",
contextOfItemsFootPrint, boundaryItems);
//.........这里部分代码省略.........
示例5: CreateExtrudedProductDefShape
/// <summary>
/// Creates a extruded product definition shape representation.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="element">The base element.</param>
/// <param name="categoryId">The category of the element.</param>
/// <param name="curveLoops">The curve loops defining the extruded surface.</param>
/// <param name="plane">The extrusion base plane.</param>
/// <param name="extrDirVec">The extrusion direction.</param>
/// <param name="extrusionSize">The scaled extrusion length.</param>
/// <returns>The handle.</returns>
public static IFCAnyHandle CreateExtrudedProductDefShape(ExporterIFC exporterIFC, Element element, ElementId categoryId,
IList<CurveLoop> curveLoops, Plane plane, XYZ extrDirVec, double extrusionSize)
{
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle extrusionHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, null, curveLoops, plane,
extrDirVec, extrusionSize);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(extrusionHnd))
return null;
ISet<IFCAnyHandle> bodyItems = new HashSet<IFCAnyHandle>();
bodyItems.Add(extrusionHnd);
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("Body");
IFCAnyHandle shapeRepHnd = CreateSweptSolidRep(exporterIFC, element, categoryId, contextOfItems, bodyItems, null);
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
shapeReps.Add(shapeRepHnd);
return IFCInstanceExporter.CreateProductDefinitionShape(file, null, null, shapeReps);
}
示例6: ExportCurtainObjectCommonAsOneBRep
/// <summary>
/// Exports curtain object as one Brep.
/// </summary>
/// <param name="allSubElements">
/// Collection of elements contained in the host curtain element.
/// </param>
/// <param name="wallElement">
/// The curtain wall element.
/// </param>
/// <param name="exporterIFC">
/// The ExporterIFC object.
/// </param>
/// <param name="setter">
/// The IFCPlacementSetter object.
/// </param>
/// <param name="localPlacement">
/// The local placement handle.
/// </param>
/// <returns>
/// The handle.
/// </returns>
public static IFCAnyHandle ExportCurtainObjectCommonAsOneBRep(ElementSet allSubElements, Element wallElement,
ExporterIFC exporterIFC, IFCPlacementSetter setter, IFCAnyHandle localPlacement)
{
IFCAnyHandle prodDefRep = IFCAnyHandle.Create();
double eps = wallElement.Document.Application.VertexTolerance * exporterIFC.LinearScale;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle();
IFCGeometryInfo info = IFCGeometryInfo.CreateSurfaceGeometryInfo(eps);
HashSet<IFCAnyHandle> bodyItems = new HashSet<IFCAnyHandle>();
// Want to make sure we don't accidentally add a mullion or curtain line more than once.
HashSet<ElementId> alreadyVisited = new HashSet<ElementId>();
Options geomOptions = new Options();
foreach (Element subElem in allSubElements)
{
GeometryElement geometryElement = subElem.get_Geometry(geomOptions);
if (geometryElement == null)
continue;
if (alreadyVisited.Contains(subElem.Id))
continue;
alreadyVisited.Add(subElem.Id);
ExporterIFCUtils.CollectGeometryInfo(exporterIFC, info, geometryElement, XYZ.Zero, false);
IFCAnyHandle outer = file.CreateClosedShell(info.GetSurfaces());
if (outer.HasValue)
bodyItems.Add(RepresentationUtil.CreateFacetedBRep(exporterIFC, outer));
}
if (bodyItems.Count == 0)
return prodDefRep;
ElementId catId = CategoryUtil.GetSafeCategoryId(wallElement);
IFCAnyHandle shapeRep = RepresentationUtil.CreateBRepRep(exporterIFC, catId, contextOfItems, bodyItems);
if (!shapeRep.HasValue)
return prodDefRep;
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
shapeReps.Add(shapeRep);
prodDefRep = file.CreateProductDefinitionShape(IFCLabel.Create(), IFCLabel.Create(), shapeReps);
return prodDefRep;
}
示例7: ExportGutter
/// <summary>
/// Exports a gutter element.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="element">The element.</param>
/// <param name="geometryElement">The geometry element.</param>
/// <param name="productWrapper">The ProductWrapper.</param>
public static void ExportGutter(ExporterIFC exporterIFC, Element element, GeometryElement geometryElement, ProductWrapper productWrapper)
{
IFCFile file = exporterIFC.GetFile();
using (IFCTransaction tr = new IFCTransaction(file))
{
using (PlacementSetter setter = PlacementSetter.Create(exporterIFC, element))
{
using (IFCExtrusionCreationData ecData = new IFCExtrusionCreationData())
{
ecData.SetLocalPlacement(setter.LocalPlacement);
ElementId categoryId = CategoryUtil.GetSafeCategoryId(element);
BodyExporterOptions bodyExporterOptions = new BodyExporterOptions();
IFCAnyHandle bodyRep = BodyExporter.ExportBody(exporterIFC, element, categoryId, ElementId.InvalidElementId,
geometryElement, bodyExporterOptions, ecData).RepresentationHnd;
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyRep))
{
if (ecData != null)
ecData.ClearOpenings();
return;
}
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
string originalTag = NamingUtil.CreateIFCElementId(element);
// In Revit, we don't have a corresponding type, so we create one for every gutter.
IFCAnyHandle origin = ExporterUtil.CreateAxis2Placement3D(file);
IFCAnyHandle repMap3dHnd = IFCInstanceExporter.CreateRepresentationMap(file, origin, bodyRep);
List<IFCAnyHandle> repMapList = new List<IFCAnyHandle>();
repMapList.Add(repMap3dHnd);
string elementTypeName = NamingUtil.CreateIFCObjectName(exporterIFC, element);
string typeGuid = GUIDUtil.CreateSubElementGUID(element, (int) IFCHostedSweepSubElements.PipeSegmentType);
IFCAnyHandle style = IFCInstanceExporter.CreatePipeSegmentType(file, typeGuid, ownerHistory,
elementTypeName, null, null, null, repMapList, originalTag,
elementTypeName, IFCPipeSegmentType.Gutter);
List<IFCAnyHandle> representationMaps = GeometryUtil.GetRepresentationMaps(style);
IFCAnyHandle mappedItem = ExporterUtil.CreateDefaultMappedItem(file, representationMaps[0]);
ISet<IFCAnyHandle> representations = new HashSet<IFCAnyHandle>();
representations.Add(mappedItem);
IFCAnyHandle bodyMappedItemRep = RepresentationUtil.CreateBodyMappedItemRep(exporterIFC,
element, categoryId, exporterIFC.Get3DContextHandle("Body"), representations);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyMappedItemRep))
return;
List<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
shapeReps.Add(bodyMappedItemRep);
IFCAnyHandle boundingBoxRep = BoundingBoxExporter.ExportBoundingBox(exporterIFC, geometryElement, Transform.Identity);
if (boundingBoxRep != null)
shapeReps.Add(boundingBoxRep);
IFCAnyHandle prodRep = IFCInstanceExporter.CreateProductDefinitionShape(file, null, null, shapeReps);
IFCAnyHandle localPlacementToUse;
ElementId roomId = setter.UpdateRoomRelativeCoordinates(element, out localPlacementToUse);
if (roomId == ElementId.InvalidElementId)
localPlacementToUse = ecData.GetLocalPlacement();
string guid = GUIDUtil.CreateGUID(element);
string name = NamingUtil.GetNameOverride(element, NamingUtil.GetIFCName(element));
string description = NamingUtil.GetDescriptionOverride(element, null);
string objectType = NamingUtil.GetObjectTypeOverride(element, elementTypeName);
string tag = NamingUtil.GetTagOverride(element, originalTag);
IFCAnyHandle elemHnd = IFCInstanceExporter.CreateFlowSegment(file, guid,
ownerHistory, name, description, objectType, localPlacementToUse, prodRep, tag);
bool containedInSpace = (roomId != ElementId.InvalidElementId);
productWrapper.AddElement(element, elemHnd, setter.LevelInfo, ecData, !containedInSpace);
if (containedInSpace)
ExporterCacheManager.SpaceInfoCache.RelateToSpace(roomId, elemHnd);
// Associate segment with type.
ExporterCacheManager.TypeRelationsCache.Add(style, elemHnd);
OpeningUtil.CreateOpeningsIfNecessary(elemHnd, element, ecData, null,
exporterIFC, localPlacementToUse, setter, productWrapper);
}
tr.Commit();
}
}
}
示例8: ExportWallBase
/// <summary>
/// Main implementation to export walls.
/// </summary>
/// <param name="exporterIFC">
/// The ExporterIFC object.
/// </param>
/// <param name="element">
/// The element.
/// </param>
/// <param name="geometryElement">
/// The geometry element.
/// </param>
/// <param name="origWrapper">
/// The IFCProductWrapper.
/// </param>
/// <param name="overrideLevelId">
/// The level id.
/// </param>
/// <param name="range">
/// The range to be exported for the element.
/// </param>
/// <returns>
/// The exported wall handle.
/// </returns>
public static IFCAnyHandle ExportWallBase(ExporterIFC exporterIFC, Element element, GeometryElement geometryElement,
IFCProductWrapper origWrapper, ElementId overrideLevelId, IFCRange range)
{
using (IFCProductWrapper localWrapper = IFCProductWrapper.Create(origWrapper))
{
ElementId catId = CategoryUtil.GetSafeCategoryId(element);
Wall wallElement = element as Wall;
FamilyInstance famInstWallElem = element as FamilyInstance;
if (wallElement == null && famInstWallElem == null)
return null;
if (wallElement != null && IsWallCompletelyClipped(wallElement, exporterIFC, range))
return null;
// get global values.
Document doc = element.Document;
double scale = exporterIFC.LinearScale;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
IFCAnyHandle contextOfItemsAxis = exporterIFC.Get3DContextHandle("Axis");
IFCAnyHandle contextOfItemsBody = exporterIFC.Get3DContextHandle("Body");
IFCRange zSpan = new IFCRange();
double depth = 0.0;
bool validRange = (range != null && !MathUtil.IsAlmostZero(range.Start - range.End));
bool exportParts = PartExporter.CanExportParts(wallElement);
if (exportParts && !PartExporter.CanExportElementInPartExport(wallElement, validRange? overrideLevelId : wallElement.Level.Id, validRange))
return null;
// get bounding box height so that we can subtract out pieces properly.
// only for Wall, not FamilyInstance.
if (wallElement != null && geometryElement != null)
{
BoundingBoxXYZ boundingBox = element.get_BoundingBox(null);
if (boundingBox == null)
return null;
zSpan = new IFCRange(boundingBox.Min.Z, boundingBox.Max.Z);
// if we have a top clipping plane, modify depth accordingly.
double bottomHeight = validRange ? Math.Max(zSpan.Start, range.Start) : zSpan.Start;
double topHeight = validRange ? Math.Min(zSpan.End, range.End) : zSpan.End;
depth = topHeight - bottomHeight;
if (MathUtil.IsAlmostZero(depth))
return null;
depth *= scale;
}
IFCAnyHandle axisRep = null;
IFCAnyHandle bodyRep = null;
bool exportingAxis = false;
Curve curve = null;
bool exportedAsWallWithAxis = false;
bool exportedBodyDirectly = false;
bool exportingInplaceOpenings = false;
Curve centerCurve = GetWallAxis(wallElement);
XYZ localXDir = new XYZ(1, 0, 0);
XYZ localYDir = new XYZ(0, 1, 0);
XYZ localZDir = new XYZ(0, 0, 1);
XYZ localOrig = new XYZ(0, 0, 0);
double eps = MathUtil.Eps();
if (centerCurve != null)
{
Curve baseCurve = GetWallAxisAtBaseHeight(wallElement);
curve = GetWallTrimmedCurve(wallElement, baseCurve);
IFCRange curveBounds;
XYZ oldOrig;
//.........这里部分代码省略.........
示例9: GetOrCreateMaterialHandle
/// <summary>
/// Gets material handle from material id or creates one if there is none.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="materialId">The material id.</param>
/// <returns>The handle.</returns>
public static IFCAnyHandle GetOrCreateMaterialHandle(ExporterIFC exporterIFC, ElementId materialId)
{
Document document = ExporterCacheManager.Document;
IFCAnyHandle materialNameHandle = ExporterCacheManager.MaterialHandleCache.Find(materialId);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(materialNameHandle))
{
string materialName = " <Unnamed>";
if (materialId != ElementId.InvalidElementId)
{
Material material = document.GetElement(materialId) as Material;
if (material != null)
{
materialName = material.Name;
}
}
materialNameHandle = IFCInstanceExporter.CreateMaterial(exporterIFC.GetFile(), materialName);
ExporterCacheManager.MaterialHandleCache.Register(materialId, materialNameHandle);
// associate Material with SurfaceStyle if necessary.
IFCFile file = exporterIFC.GetFile();
if (materialId != ElementId.InvalidElementId && !ExporterCacheManager.ExportOptionsCache.ExportAs2x2 && materialNameHandle.HasValue)
{
HashSet<IFCAnyHandle> matRepHandles = IFCAnyHandleUtil.GetHasRepresentation(materialNameHandle);
if (matRepHandles.Count == 0)
{
Material matElem = document.GetElement(materialId) as Material;
ElementId fillPatternId = (matElem != null) ? matElem.CutPatternId : ElementId.InvalidElementId;
Autodesk.Revit.DB.Color color = (matElem != null) ? GetSafeColor(matElem.CutPatternColor) : new Color(0, 0, 0);
double planScale = 100.0;
HashSet<IFCAnyHandle> styles = new HashSet<IFCAnyHandle>();
bool hasFill = false;
IFCAnyHandle styledRepItem = null;
IFCAnyHandle matStyleHnd = CategoryUtil.GetOrCreateMaterialStyle(document, exporterIFC, materialId);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(matStyleHnd))
{
styles.Add(matStyleHnd);
bool supportCutStyles = !ExporterCacheManager.ExportOptionsCache.ExportAsCoordinationView2;
if (fillPatternId != ElementId.InvalidElementId && supportCutStyles)
{
IFCAnyHandle cutStyleHnd = exporterIFC.GetOrCreateFillPattern(fillPatternId, color, planScale);
if (cutStyleHnd.HasValue)
{
styles.Add(cutStyleHnd);
hasFill = true;
}
}
IFCAnyHandle presStyleHnd = IFCInstanceExporter.CreatePresentationStyleAssignment(file, styles);
HashSet<IFCAnyHandle> presStyleSet = new HashSet<IFCAnyHandle>();
presStyleSet.Add(presStyleHnd);
IFCAnyHandle styledItemHnd = IFCInstanceExporter.CreateStyledItem(file, styledRepItem, presStyleSet, null);
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("");
string repId = "Style";
string repType = (hasFill) ? "Material and Cut Pattern" : "Material";
HashSet<IFCAnyHandle> repItems = new HashSet<IFCAnyHandle>();
repItems.Add(styledItemHnd);
IFCAnyHandle styleRepHnd = IFCInstanceExporter.CreateStyledRepresentation(file, contextOfItems, repId, repType, repItems);
List<IFCAnyHandle> repList = new List<IFCAnyHandle>();
repList.Add(styleRepHnd);
IFCAnyHandle matDefRepHnd = IFCInstanceExporter.CreateMaterialDefinitionRepresentation(file, null, null, repList, materialNameHandle);
}
}
}
}
return materialNameHandle;
}
示例10: CreateIFCSpace
//.........这里部分代码省略.........
Options geomOptions = GeometryUtil.GetIFCExportGeometryOptions();
geomElem = spatialElementAsArea.get_Geometry(geomOptions);
}
IFCAnyHandle spaceHnd = null;
string spatialElementName = null;
using (IFCExtrusionCreationData extraParams = new IFCExtrusionCreationData())
{
extraParams.SetLocalPlacement(localPlacement);
extraParams.PossibleExtrusionAxes = IFCExtrusionAxes.TryZ;
using (IFCTransaction transaction2 = new IFCTransaction(file))
{
IFCAnyHandle repHnd = null;
if (!ExporterCacheManager.ExportOptionsCache.Use2DRoomBoundaryForRoomVolumeCreation && geomElem != null)
{
BodyExporterOptions bodyExporterOptions = new BodyExporterOptions(true);
bodyExporterOptions.TessellationLevel = BodyExporter.GetTessellationLevel();
repHnd = RepresentationUtil.CreateAppropriateProductDefinitionShape(exporterIFC, spatialElement,
catId, geomElem, bodyExporterOptions, null, extraParams, false);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(repHnd))
extraParams.ClearOpenings();
}
else
{
IFCAnyHandle shapeRep = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, null, curveLoops, plane, zDir, scaledRoomHeight);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(shapeRep))
return false;
IFCAnyHandle styledItemHnd = BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document,
shapeRep, ElementId.InvalidElementId);
HashSet<IFCAnyHandle> bodyItems = new HashSet<IFCAnyHandle>();
bodyItems.Add(shapeRep);
shapeRep = RepresentationUtil.CreateSweptSolidRep(exporterIFC, spatialElement, catId, exporterIFC.Get3DContextHandle("Body"), bodyItems, null);
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
shapeReps.Add(shapeRep);
IFCAnyHandle boundingBoxRep = BoundingBoxExporter.ExportBoundingBox(exporterIFC, geomElem, Transform.Identity);
if (boundingBoxRep != null)
shapeReps.Add(boundingBoxRep);
repHnd = IFCInstanceExporter.CreateProductDefinitionShape(file, null, null, shapeReps);
}
extraParams.ScaledHeight = scaledRoomHeight;
extraParams.ScaledArea = dArea;
spatialElementName = NamingUtil.GetNameOverride(spatialElement, name);
string spatialElementDescription = NamingUtil.GetDescriptionOverride(spatialElement, desc);
string spatialElementObjectType = NamingUtil.GetObjectTypeOverride(spatialElement, null);
string spatialElementLongName = NamingUtil.GetLongNameOverride(spatialElement, longName);
double? spaceElevationWithFlooring = null;
double elevationWithFlooring = 0.0;
if (ParameterUtil.GetDoubleValueFromElement(spatialElement, null, "IfcElevationWithFlooring", out elevationWithFlooring) != null)
spaceElevationWithFlooring = UnitUtil.ScaleLength(elevationWithFlooring);
spaceHnd = IFCInstanceExporter.CreateSpace(file, GUIDUtil.CreateGUID(spatialElement),
ExporterCacheManager.OwnerHistoryHandle,
spatialElementName, spatialElementDescription, spatialElementObjectType,
extraParams.GetLocalPlacement(), repHnd, spatialElementLongName, Toolkit.IFCElementComposition.Element,
internalOrExternal, spaceElevationWithFlooring);
transaction2.Commit();
}
if (spaceHnd != null)
示例11: ExportGrid
/// <summary>
/// Export one IFCGrid in one level.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="levelId">The level ID.</param>
/// <param name="sameDirectionAxesU">The U axes of grids.</param>
/// <param name="sameDirectionAxesV">The V axes of grids.</param>
/// <param name="sameDirectionAxesW">The W axes of grids.</param>
public static void ExportGrid(ExporterIFC exporterIFC, ElementId levelId, List<Grid> sameDirectionAxesU, List<Grid> sameDirectionAxesV, List<Grid> sameDirectionAxesW)
{
List<IFCAnyHandle> axesU = null;
List<IFCAnyHandle> axesV = null;
List<IFCAnyHandle> axesW = null;
List<IFCAnyHandle> representations = new List<IFCAnyHandle>();
using (ProductWrapper productWrapper = ProductWrapper.Create(exporterIFC, true))
{
IFCFile ifcFile = exporterIFC.GetFile();
using (IFCTransaction transaction = new IFCTransaction(ifcFile))
{
GridRepresentationData gridRepresentationData = new GridRepresentationData();
axesU = CreateIFCGridAxisAndRepresentations(exporterIFC, productWrapper, sameDirectionAxesU, representations, gridRepresentationData);
axesV = CreateIFCGridAxisAndRepresentations(exporterIFC, productWrapper, sameDirectionAxesV, representations, gridRepresentationData);
if (sameDirectionAxesW != null)
axesW = CreateIFCGridAxisAndRepresentations(exporterIFC, productWrapper, sameDirectionAxesW, representations, gridRepresentationData);
IFCAnyHandle contextOfItemsFootPrint = exporterIFC.Get3DContextHandle("FootPrint");
string identifierOpt = "FootPrint";
string representationTypeOpt = "GeometricCurveSet";
int numGridsToExport = gridRepresentationData.m_Grids.Count;
if (numGridsToExport == 0)
return;
bool useIFCCADLayer = !string.IsNullOrWhiteSpace(gridRepresentationData.m_IFCCADLayer);
IFCAnyHandle shapeRepresentation = null;
HashSet<IFCAnyHandle> allCurves = new HashSet<IFCAnyHandle>();
for (int ii = 0; ii < numGridsToExport; ii++)
allCurves.UnionWith(gridRepresentationData.m_curveSets[ii]);
if (useIFCCADLayer)
{
shapeRepresentation = RepresentationUtil.CreateShapeRepresentation(exporterIFC, contextOfItemsFootPrint,
identifierOpt, representationTypeOpt, allCurves, gridRepresentationData.m_IFCCADLayer);
}
else
{
ElementId catId = CategoryUtil.GetSafeCategoryId(gridRepresentationData.m_Grids[0]);
shapeRepresentation = RepresentationUtil.CreateShapeRepresentation(exporterIFC, gridRepresentationData.m_Grids[0], catId,
contextOfItemsFootPrint, identifierOpt, representationTypeOpt, allCurves);
}
representations.Add(shapeRepresentation);
IFCAnyHandle productRep = IFCInstanceExporter.CreateProductDefinitionShape(ifcFile, null, null, representations);
IFCLevelInfo levelInfo = ExporterCacheManager.LevelInfoCache.GetLevelInfo(exporterIFC, levelId);
string gridGUID = GUIDUtil.CreateGUID();
// Get the first grid's override name, if cannot find it, use null.
string gridName = GetGridName(sameDirectionAxesU, sameDirectionAxesV, sameDirectionAxesW);
IFCAnyHandle ownerHistory = exporterIFC.GetOwnerHistoryHandle();
IFCAnyHandle gridLevelHandle = levelInfo.GetBuildingStorey();
IFCAnyHandle levelObjectPlacement = IFCAnyHandleUtil.GetInstanceAttribute(gridLevelHandle, "ObjectPlacement");
double elev = levelInfo.Elevation;
double scaleFactor = exporterIFC.LinearScale;
double elevation = elev * scaleFactor;
XYZ orig = new XYZ(0.0, 0.0, elevation);
IFCAnyHandle copyLevelPlacement = ExporterUtil.CopyLocalPlacement(ifcFile, levelObjectPlacement);
IFCAnyHandle ifcGrid = IFCInstanceExporter.CreateGrid(ifcFile, gridGUID, ownerHistory, gridName, null, null, copyLevelPlacement, productRep, axesU, axesV, axesW);
productWrapper.AddElement(null, ifcGrid, levelInfo, null, true);
transaction.Commit();
}
}
}
示例12: CreateExtrusionWithClippingBase
private static HandleAndAnalyzer CreateExtrusionWithClippingBase(ExporterIFC exporterIFC, Element element,
ElementId catId, IList<Solid> solids, Plane plane, XYZ projDir, IFCRange range, out bool completelyClipped, out HashSet<ElementId> materialIds)
{
IFCFile file = exporterIFC.GetFile();
bool mustUseTessellation = false;
using (IFCTransaction tr = new IFCTransaction(file))
{
completelyClipped = false;
materialIds = new HashSet<ElementId>();
HandleAndAnalyzer retVal = new HandleAndAnalyzer();
HashSet<IFCAnyHandle> extrusionBodyItems = new HashSet<IFCAnyHandle>();
HashSet<IFCAnyHandle> extrusionBooleanBodyItems = new HashSet<IFCAnyHandle>();
HashSet<IFCAnyHandle> extrusionClippingBodyItems = new HashSet<IFCAnyHandle>();
foreach (Solid solid in solids)
{
bool hasClippingResult = false;
bool hasBooleanResult = false;
ElementId materialId = ElementId.InvalidElementId;
HandleAndAnalyzer currRetVal = CreateExtrusionWithClippingAndOpening(exporterIFC, element, catId, solid, plane, projDir, range,
out completelyClipped, out hasClippingResult, out hasBooleanResult, out materialId);
if (currRetVal != null && currRetVal.Handle != null)
{
// If any of the solid is of the type of Clipping or Boolean and export is for Reference View, exit the loop and collect the geometries entirely
// for TriangulatedFaceSet
if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView && (hasClippingResult || hasBooleanResult))
{
mustUseTessellation = true;
break;
}
materialIds.Add(materialId);
IFCAnyHandle repHandle = currRetVal.Handle;
if (hasBooleanResult) // if both have boolean and clipping result, use boolean one.
extrusionBooleanBodyItems.Add(repHandle);
else if (hasClippingResult)
extrusionClippingBodyItems.Add(repHandle);
else
extrusionBodyItems.Add(repHandle);
}
else
{
tr.RollBack();
// TODO: include this cleanup in RollBack(), to avoid issues.
ExporterCacheManager.MaterialIdToStyleHandleCache.RemoveInvalidHandles(materialIds, IFCEntityType.IfcSurfaceStyle);
ExporterCacheManager.PresentationStyleAssignmentCache.RemoveInvalidHandles(materialIds);
return retVal;
}
// currRetVal will only have one extrusion. Use the analyzer from the "last" extrusion. Should only really be used for one extrusion.
retVal.Analyzer = currRetVal.Analyzer;
retVal.BaseExtrusions.Add(currRetVal.BaseExtrusions[0]);
}
IFCAnyHandle contextOfItemsBody = exporterIFC.Get3DContextHandle("Body");
// Handle Tessellation here for Reference View export. If all are extrusions, it should not get in here
if (mustUseTessellation)
{
BodyExporterOptions options = new BodyExporterOptions(true);
Document document = element.Document;
ElementId materialId = ElementId.InvalidElementId;
materialIds.Clear();
extrusionBodyItems.Clear();
foreach (Solid solid in solids)
{
IFCAnyHandle triangulatedBodyItem = BodyExporter.ExportBodyAsTriangulatedFaceSet(exporterIFC, element, options, solid);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(triangulatedBodyItem))
extrusionBodyItems.Add(triangulatedBodyItem);
materialId = BodyExporter.GetBestMaterialIdFromGeometryOrParameter(solid, exporterIFC, element);
materialIds.Add(materialId);
BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document, triangulatedBodyItem, materialId);
}
retVal.Handle = RepresentationUtil.CreateTessellatedRep(exporterIFC, element, catId, contextOfItemsBody, extrusionBodyItems, null);
retVal.ShapeRepresentationType = ShapeRepresentationType.Tessellation;
}
else
{
if (extrusionBodyItems.Count > 0 && (extrusionClippingBodyItems.Count == 0 && extrusionBooleanBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBodyItems, null);
retVal.ShapeRepresentationType = ShapeRepresentationType.SweptSolid;
}
else if (extrusionClippingBodyItems.Count > 0 && (extrusionBodyItems.Count == 0 && extrusionBooleanBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateClippingRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionClippingBodyItems);
retVal.ShapeRepresentationType = ShapeRepresentationType.Clipping;
}
else if (extrusionBooleanBodyItems.Count > 0 && (extrusionBodyItems.Count == 0 && extrusionClippingBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateCSGRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBooleanBodyItems);
retVal.ShapeRepresentationType = ShapeRepresentationType.CSG;
}
else
//.........这里部分代码省略.........
示例13: ExportBody
/// <summary>
/// Exports list of geometries to IFC body representation.
/// </summary>
/// <param name="application">The Revit application.</param>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="categoryId">The category id.</param>
/// <param name="geometryListIn">The geometry list.</param>
/// <param name="options">The settings for how to export the body.</param>
/// <param name="exportBodyParams">The extrusion creation data.</param>
/// <returns>The BodyData containing the handle, offset and material ids.</returns>
public static BodyData ExportBody(Autodesk.Revit.ApplicationServices.Application application,
ExporterIFC exporterIFC,
Element element,
ElementId categoryId,
IList<GeometryObject> geometryListIn,
BodyExporterOptions options,
IFCExtrusionCreationData exportBodyParams)
{
BodyData bodyData = new BodyData();
if (geometryListIn.Count == 0)
return bodyData;
Document document = element.Document;
bool tryToExportAsExtrusion = options.TryToExportAsExtrusion;
bool canExportSolidModelRep = false;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("Body");
double scale = exporterIFC.LinearScale;
double eps = application.VertexTolerance * scale;
IList<GeometryObject> splitGeometryList = new List<GeometryObject>();
bool allFaces = true;
foreach (GeometryObject geomObject in geometryListIn)
{
try
{
bool split = false;
if (geomObject is Solid)
{
Solid solid = geomObject as Solid;
IList<Solid> splitVolumes = SolidUtils.SplitVolumes(solid);
allFaces = false;
if (splitVolumes != null && splitVolumes.Count != 0)
{
split = true;
foreach (Solid currSolid in splitVolumes)
{
splitGeometryList.Add(currSolid);
// The geometry element created by SplitVolumesis a copy which will have its own allocated
// membership - this needs to be stored and disposed of (see AllocatedGeometryObjectCache
// for details)
ExporterCacheManager.AllocatedGeometryObjectCache.AddGeometryObject(currSolid);
}
}
}
else if (allFaces && !(geomObject is Face))
allFaces = false;
if (!split)
splitGeometryList.Add(geomObject);
}
catch
{
splitGeometryList.Add(geomObject);
}
}
IList<IFCAnyHandle> bodyItems = new List<IFCAnyHandle>();
IList<ElementId> materialIdsForExtrusions = new List<ElementId>();
IList<int> exportAsBRep = new List<int>();
IList<int> exportAsExtrusion = new List<int>();
using (IFCTransaction tr = new IFCTransaction(file))
{
if (tryToExportAsExtrusion)
{
// Check to see if we have Geometries or GFaces.
// We will have the specific all GFaces case and then the generic case.
IList<Face> faces = null;
if (allFaces)
{
faces = new List<Face>();
foreach (GeometryObject geometryObject in splitGeometryList)
{
faces.Add(geometryObject as Face);
}
}
int numExtrusionsToCreate = allFaces ? 1 : splitGeometryList.Count;
IList<IList<IFCExtrusionData>> extrusionLists = new List<IList<IFCExtrusionData>>();
for (int ii = 0; ii < numExtrusionsToCreate && tryToExportAsExtrusion; ii++)
{
IList<IFCExtrusionData> extrusionList = new List<IFCExtrusionData>();
//.........这里部分代码省略.........
示例14: ExportBody
/// <summary>
/// Exports list of geometries to IFC body representation.
/// </summary>
/// <param name="exporterIFC">The ExporterIFC object.</param>
/// <param name="categoryId">The category id.</param>
/// <param name="geometryListIn">The geometry list.</param>
/// <param name="options">The settings for how to export the body.</param>
/// <param name="exportBodyParams">The extrusion creation data.</param>
/// <returns>The BodyData containing the handle, offset and material ids.</returns>
public static BodyData ExportBody(ExporterIFC exporterIFC,
Element element,
ElementId categoryId,
ElementId overrideMaterialId,
IList<GeometryObject> geometryList,
BodyExporterOptions options,
IFCExtrusionCreationData exportBodyParams)
{
BodyData bodyData = new BodyData();
if (geometryList.Count == 0)
return bodyData;
Document document = element.Document;
bool tryToExportAsExtrusion = options.TryToExportAsExtrusion;
bool canExportSolidModelRep = tryToExportAsExtrusion && ExporterCacheManager.ExportOptionsCache.CanExportSolidModelRep;
bool useCoarseTessellation = (ExporterCacheManager.ExportOptionsCache.LevelOfDetail < 4);
bool allowAdvancedBReps = ExporterCacheManager.ExportOptionsCache.ExportAs4 && !ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView;
// We will try to export as a swept solid if the option is set, and we are either exporting to a schema that allows it,
// or we are using a coarse tessellation, in which case we will export the swept solid as an optimzed BRep.
bool tryToExportAsSweptSolid = options.TryToExportAsSweptSolid && (allowAdvancedBReps || useCoarseTessellation);
// We will allow exporting swept solids as BReps or TriangulatedFaceSet if we are exporting to a schema before IFC4, or to a Reference View MVD,
// and we allow coarse representations. In the future, we may allow more control here.
// Note that we disable IFC4 because in IFC4, we will export it as a true swept solid instead, except for the Reference View MVD.
bool tryToExportAsSweptSolidAsTessellation = tryToExportAsSweptSolid && useCoarseTessellation && !allowAdvancedBReps;
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle contextOfItems = exporterIFC.Get3DContextHandle("Body");
double eps = UnitUtil.ScaleLength(element.Document.Application.VertexTolerance);
bool allFaces = true;
foreach (GeometryObject geomObject in geometryList)
{
if (!(geomObject is Face))
{
allFaces = false;
break;
}
}
IList<IFCAnyHandle> bodyItems = new List<IFCAnyHandle>();
IList<ElementId> materialIdsForExtrusions = new List<ElementId>();
// This is a list of geometries that can be exported using the coarse facetation of the SweptSolidExporter.
IList<KeyValuePair<int, SimpleSweptSolidAnalyzer>> exportAsBRep = new List<KeyValuePair<int, SimpleSweptSolidAnalyzer>>();
IList<int> exportAsSweptSolid = new List<int>();
IList<int> exportAsExtrusion = new List<int>();
bool hasExtrusions = false;
bool hasSweptSolids = false;
bool hasSweptSolidsAsBReps = false;
ShapeRepresentationType hasRepresentationType = ShapeRepresentationType.Undefined;
BoundingBoxXYZ bbox = GeometryUtil.GetBBoxOfGeometries(geometryList);
XYZ unscaledTrfOrig = new XYZ();
int numItems = geometryList.Count;
bool tryExtrusionAnalyzer = tryToExportAsExtrusion && (options.ExtrusionLocalCoordinateSystem != null) && (numItems == 1) && (geometryList[0] is Solid);
bool supportOffsetTransformForExtrusions = !(tryExtrusionAnalyzer || tryToExportAsSweptSolidAsTessellation);
bool useOffsetTransformForExtrusions = (options.AllowOffsetTransform && supportOffsetTransformForExtrusions && (exportBodyParams != null));
using (IFCTransaction tr = new IFCTransaction(file))
{
// generate "bottom corner" of bbox; create new local placement if passed in.
// need to transform, but not scale, this point to make it the new origin.
using (TransformSetter transformSetter = TransformSetter.Create())
{
if (useOffsetTransformForExtrusions)
bodyData.OffsetTransform = transformSetter.InitializeFromBoundingBox(exporterIFC, bbox, exportBodyParams, out unscaledTrfOrig);
// If we passed in an ExtrusionLocalCoordinateSystem, and we have 1 Solid, we will try to create an extrusion using the ExtrusionAnalyzer.
// If we succeed, we will skip the rest of the routine, otherwise we will try with the backup extrusion method.
// This doesn't yet create fallback information for solid models that are hybrid extrusions and BReps.
if (tryToExportAsExtrusion)
{
if (tryExtrusionAnalyzer)
{
using (IFCTransaction extrusionTransaction = new IFCTransaction(file))
{
Plane extrusionPlane = new Plane(
options.ExtrusionLocalCoordinateSystem.BasisY,
options.ExtrusionLocalCoordinateSystem.BasisZ,
options.ExtrusionLocalCoordinateSystem.Origin);
XYZ extrusionDirection = options.ExtrusionLocalCoordinateSystem.BasisX;
bool completelyClipped;
HandleAndData extrusionData = ExtrusionExporter.CreateExtrusionWithClippingAndProperties(exporterIFC, element,
//.........这里部分代码省略.........
示例15: CreateExtrusionWithClippingBase
private static HandleAndAnalyzer CreateExtrusionWithClippingBase(ExporterIFC exporterIFC, Element element,
ElementId catId, IList<Solid> solids, Plane plane, XYZ projDir, IFCRange range, out bool completelyClipped, out HashSet<ElementId> materialIds)
{
IFCFile file = exporterIFC.GetFile();
using (IFCTransaction tr = new IFCTransaction(file))
{
completelyClipped = false;
materialIds = new HashSet<ElementId>();
HandleAndAnalyzer retVal = new HandleAndAnalyzer();
HashSet<IFCAnyHandle> extrusionBodyItems = new HashSet<IFCAnyHandle>();
HashSet<IFCAnyHandle> extrusionBooleanBodyItems = new HashSet<IFCAnyHandle>();
HashSet<IFCAnyHandle> extrusionClippingBodyItems = new HashSet<IFCAnyHandle>();
foreach (Solid solid in solids)
{
bool hasClippingResult = false;
bool hasBooleanResult = false;
ElementId materialId = ElementId.InvalidElementId;
retVal = CreateExtrsionWithClippingAndOpening(exporterIFC, element, catId, solid, plane, projDir, range,
out completelyClipped, out hasClippingResult, out hasBooleanResult, out materialId);
if (retVal != null && retVal.Handle != null)
{
materialIds.Add(materialId);
IFCAnyHandle repHandle = retVal.Handle;
if (hasBooleanResult) // if both have boolean and clipping result, use boolean one.
extrusionBooleanBodyItems.Add(repHandle);
else if (hasClippingResult)
extrusionClippingBodyItems.Add(repHandle);
else
extrusionBodyItems.Add(repHandle);
}
else
{
tr.RollBack();
return retVal;
}
}
IFCAnyHandle contextOfItemsBody = exporterIFC.Get3DContextHandle("Body");
if (extrusionBodyItems.Count > 0 && (extrusionClippingBodyItems.Count == 0 && extrusionBooleanBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBodyItems, null);
}
else if (extrusionClippingBodyItems.Count > 0 && (extrusionBodyItems.Count == 0 && extrusionBooleanBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateClippingRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionClippingBodyItems);
}
else if (extrusionBooleanBodyItems.Count > 0 && (extrusionBodyItems.Count == 0 && extrusionClippingBodyItems.Count == 0))
{
retVal.Handle = RepresentationUtil.CreateCSGRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBooleanBodyItems);
}
else
{
IFCAnyHandle finalBodyItemHnd = null;
ICollection<IFCAnyHandle> booleanBodyItems = extrusionClippingBodyItems.Union<IFCAnyHandle>(extrusionBooleanBodyItems).ToList();
finalBodyItemHnd = booleanBodyItems.ElementAt(0);
booleanBodyItems.Remove(finalBodyItemHnd);
// union non-boolean result first with a boolean result
foreach (IFCAnyHandle bodyRep in extrusionBodyItems)
{
finalBodyItemHnd = IFCInstanceExporter.CreateBooleanResult(exporterIFC.GetFile(), IFCBooleanOperator.Union,
finalBodyItemHnd, bodyRep);
}
foreach (IFCAnyHandle bodyRep in booleanBodyItems)
{
finalBodyItemHnd = IFCInstanceExporter.CreateBooleanResult(exporterIFC.GetFile(), IFCBooleanOperator.Union,
finalBodyItemHnd, bodyRep);
}
extrusionBodyItems.Clear();
extrusionBodyItems.Add(finalBodyItemHnd);
retVal.Handle = RepresentationUtil.CreateCSGRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBodyItems);
}
tr.Commit();
return retVal;
}
}