本文整理汇总了C#中IFCTransaction.RollBack方法的典型用法代码示例。如果您正苦于以下问题:C# IFCTransaction.RollBack方法的具体用法?C# IFCTransaction.RollBack怎么用?C# IFCTransaction.RollBack使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IFCTransaction
的用法示例。
在下文中一共展示了IFCTransaction.RollBack方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ExportBody
//.........这里部分代码省略.........
IFCAnyHandle extrusionHandle = ExtrusionExporter.CreateExtrudedSolidFromExtrusionData(exporterIFC, element, extrusionLists[ii][0]);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(extrusionHandle))
{
bodyItems.Add(extrusionHandle);
materialIdsForExtrusions.Add(exporterIFC.GetMaterialIdForCurrentExportState());
IList<CurveLoop> curveLoops = extrusionLists[ii][0].GetLoops();
XYZ extrusionDirection = extrusionLists[ii][0].ExtrusionDirection;
if (exportBodyParams != null)
{
double zOff = (whichBasis == IFCExtrusionBasis.BasisZ) ? (1.0 - Math.Abs(extrusionDirection[2])) : Math.Abs(extrusionDirection[2]);
double scaledAngle = Math.Asin(zOff) * 180 / Math.PI;
exportBodyParams.Slope = scaledAngle;
exportBodyParams.ScaledLength = extrusionLists[ii][0].ScaledExtrusionLength;
exportBodyParams.ExtrusionDirection = extrusionDirection;
for (int kk = 1; kk < extrusionLists[ii].Count; kk++)
{
ExtrusionExporter.AddOpeningData(exportBodyParams, extrusionLists[ii][kk]);
}
Plane plane = null;
double height = 0.0, width = 0.0;
if (ExtrusionExporter.ComputeHeightWidthOfCurveLoop(curveLoops[0], plane, out height, out width))
{
exportBodyParams.ScaledHeight = height * scale;
exportBodyParams.ScaledWidth = width * scale;
}
double area = ExporterIFCUtils.ComputeAreaOfCurveLoops(curveLoops);
if (area > 0.0)
{
exportBodyParams.ScaledArea = area * scale * scale;
}
double innerPerimeter = ExtrusionExporter.ComputeInnerPerimeterOfCurveLoops(curveLoops);
double outerPerimeter = ExtrusionExporter.ComputeOuterPerimeterOfCurveLoops(curveLoops);
if (innerPerimeter > 0.0)
exportBodyParams.ScaledInnerPerimeter = innerPerimeter * scale;
if (outerPerimeter > 0.0)
exportBodyParams.ScaledOuterPerimeter = outerPerimeter * scale;
}
exportedAsExtrusion = true;
}
}
if (!exportedAsExtrusion)
{
if (!canExportSolidModelRep)
{
tryToExportAsExtrusion = false;
break;
}
exportAsBRep.Add(ii);
}
}
}
if ((exportAsBRep.Count == 0) && tryToExportAsExtrusion)
{
int sz = bodyItems.Count();
for (int ii = 0; ii < sz; ii++)
BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document, bodyItems[ii], materialIdsForExtrusions[ii]);
bodyData.RepresentationHnd =
RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, categoryId, contextOfItems, bodyItems, bodyData.RepresentationHnd);
}
if (tryToExportAsExtrusion)
tr.Commit();
else
tr.RollBack();
if ((exportAsBRep.Count == 0) && tryToExportAsExtrusion)
return bodyData;
}
// We couldn't export it as an extrusion; export as a solid, brep, or a surface model.
if (!canExportSolidModelRep)
{
exportAsExtrusion.Clear();
bodyItems.Clear();
if (exportBodyParams != null)
exportBodyParams.ClearOpenings();
}
if (exportAsExtrusion.Count == 0)
exportAsBRep.Clear();
// 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.
// We will only do this if we didn't create any extrusions at all.
using (IFCTransformSetter transformSetter = IFCTransformSetter.Create())
{
if (exportBodyParams != null && (exportAsBRep.Count == 0))
bodyData.BrepOffsetTransform = transformSetter.InitializeFromBoundingBox(exporterIFC, splitGeometryList, exportBodyParams);
return ExportBodyAsBRep(exporterIFC, splitGeometryList, exportAsBRep, bodyItems, element, categoryId, contextOfItems, eps, options, bodyData);
}
}
示例2: 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
//.........这里部分代码省略.........
示例3: CreateExtrusionWithClippingAndOpening
//.........这里部分代码省略.........
// We use a sub-transaction here in case we are able to generate the base body but not the clippings.
IFCFile file = exporterIFC.GetFile();
IFCAnyHandle finalExtrusionBodyItemHnd = null;
using (IFCTransaction tr = new IFCTransaction(file))
{
// For creating the actual extrusion, we want to use the calculated extrusion plane, not the input plane.
IFCAnyHandle extrusionBodyItemHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, profileName,
extrusionBoundaryLoops, extrusionBasePlane, projDir, scaledExtrusionDepth);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(extrusionBodyItemHnd))
{
retVal.BaseExtrusions.Add(extrusionBodyItemHnd);
finalExtrusionBodyItemHnd = extrusionBodyItemHnd;
IDictionary<ElementId, ICollection<ICollection<Face>>> elementCutouts =
GeometryUtil.GetCuttingElementFaces(element, elementAnalyzer);
foreach (KeyValuePair<ElementId, ICollection<ICollection<Face>>> elementCutoutsForElement in elementCutouts)
{
// process clippings first, then openings
ICollection<ICollection<Face>> unhandledElementCutoutsForElement = new List<ICollection<Face>>();
Element cuttingElement = document.GetElement(elementCutoutsForElement.Key);
foreach (ICollection<Face> elementCutout in elementCutoutsForElement.Value)
{
ICollection<Face> skippedFaces = null;
bool unhandledClipping = false;
try
{
// The skippedFaces may represent openings that will be dealt with below.
finalExtrusionBodyItemHnd = GeometryUtil.CreateClippingFromFaces(exporterIFC, cuttingElement,
extrusionBasePlane, projDir,
elementCutout, extrusionRange, finalExtrusionBodyItemHnd, out skippedFaces);
}
catch
{
skippedFaces = null;
unhandledClipping = true;
}
if (finalExtrusionBodyItemHnd == null || unhandledClipping)
{
unhandledElementCutoutsForElement.Add(elementCutout);
}
else
{
if (finalExtrusionBodyItemHnd != extrusionBodyItemHnd)
hasClippingResult = true;
// Even if we created a clipping, we may have faces to further process as openings.
if (skippedFaces != null && skippedFaces.Count != 0)
unhandledElementCutoutsForElement.Add(skippedFaces);
}
}
IFCAnyHandle finalExtrusionClippingBodyItemHnd = finalExtrusionBodyItemHnd;
foreach (ICollection<Face> elementCutout in unhandledElementCutoutsForElement)
{
bool unhandledOpening = false;
try
{
finalExtrusionBodyItemHnd = GeometryUtil.CreateOpeningFromFaces(exporterIFC, cuttingElement,
extrusionBasePlane, projDir,
elementCutout, extrusionRange, finalExtrusionBodyItemHnd);
}
catch
{
unhandledOpening = true;
}
if (finalExtrusionBodyItemHnd == null || unhandledOpening)
{
// Item is completely clipped. We use this only when we are certain:
// 1. finalExtrusionBodyItemHnd is null.
// 2. range is not null (i.e., we expect the possibility of clipping)
// 3. unhandledOpening is not true (i.e., we didn't abort the operation).
// If completelyClipped is true, we won't export the item, so we want to make sure
// that we don't actually want to try a backup method instead.
completelyClipped = (finalExtrusionBodyItemHnd == null) && (range != null) && (!unhandledOpening);
tr.RollBack();
return nullVal;
}
else if (finalExtrusionBodyItemHnd != finalExtrusionClippingBodyItemHnd)
{
hasBooleanResult = true;
}
}
}
materialId = BodyExporter.GetBestMaterialIdFromGeometryOrParameter(solid, exporterIFC, element);
BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document, extrusionBodyItemHnd, materialId);
}
tr.Commit();
}
retVal.Handle = finalExtrusionBodyItemHnd;
return retVal;
}
catch
{
return nullVal;
}
}
示例4: ExportBodyAsAdvancedBrep
//.........这里部分代码省略.........
ConicalFace conicalFace = face as ConicalFace;
IFCAnyHandle location = GeometryUtil.XYZtoIfcCartesianPoint(exporterIFC, conicalFace.Origin, cartesianPoints);
XYZ zdir = conicalFace.Axis;
if (zdir == null)
return null;
// Create a finite profile curve for the cone based on the bounding box.
BoundingBoxUV coneUV = conicalFace.GetBoundingBox();
if (coneUV == null)
return null;
XYZ startPoint = conicalFace.Evaluate(new UV(0, coneUV.Min.V));
XYZ endPoint = conicalFace.Evaluate(new UV(0, coneUV.Max.V));
Curve profileCurve = Line.CreateBound(startPoint, endPoint);
IFCAnyHandle axis = GeometryUtil.VectorToIfcDirection(exporterIFC, zdir);
IFCAnyHandle axisPosition = IFCInstanceExporter.CreateAxis1Placement(file, location, axis);
IFCAnyHandle sweptCurve = CreateProfileCurveFromCurve(file, exporterIFC, profileCurve, Resources.ConicalFaceProfileCurve, cartesianPoints);
// The profile position is optional in IFC4+.
surface = IFCInstanceExporter.CreateSurfaceOfRevolution(file, sweptCurve, null, axisPosition);
}
else if (face is RevolvedFace)
{
RevolvedFace revFace = face as RevolvedFace;
IFCAnyHandle location = GeometryUtil.XYZtoIfcCartesianPoint(exporterIFC, revFace.Origin, cartesianPoints);
XYZ zdir = revFace.Axis;
if (zdir == null)
return null;
// Note that the returned curve is in the coordinate system of the face.
Curve curve = revFace.Curve;
if (curve == null)
return null;
// Create arbitrary plane with z direction as normal.
Plane arbitraryPlane = new Plane(zdir, XYZ.Zero);
Transform revitTransform = Transform.Identity;
revitTransform.BasisX = arbitraryPlane.XVec;
revitTransform.BasisY = arbitraryPlane.YVec;
revitTransform.BasisZ = zdir;
revitTransform.Origin = revFace.Origin;
Curve profileCurve = curve.CreateTransformed(revitTransform);
IFCAnyHandle axis = GeometryUtil.VectorToIfcDirection(exporterIFC, zdir);
IFCAnyHandle axisPosition = IFCInstanceExporter.CreateAxis1Placement(file, location, axis);
IFCAnyHandle sweptCurve = CreateProfileCurveFromCurve(file, exporterIFC, profileCurve, Resources.RevolvedFaceProfileCurve, cartesianPoints);
// The profile position is optional in IFC4+.
surface = IFCInstanceExporter.CreateSurfaceOfRevolution(file, sweptCurve, null, axisPosition);
}
else if (face is RuledFace)
{
return null; // currently does not support this type of face
}
else if (face is HermiteFace)
{
return null; // currently does not support this type of face
}
else
{
return null;
}
// If we had trouble creating a surface, stop trying.
if (IFCAnyHandleUtil.IsNullOrHasNoValue(surface))
return null;
foreach (HashSet<IFCAnyHandle> faceBound in boundsCollection)
{
IFCAnyHandle advancedFace = IFCInstanceExporter.CreateAdvancedFace(file, faceBound, surface, sameSenseAF);
cfsFaces.Add(advancedFace);
}
}
// create advancedBrep
IFCAnyHandle closedShell = IFCInstanceExporter.CreateClosedShell(file, cfsFaces);
advancedBrep = IFCInstanceExporter.CreateAdvancedBrep(file, closedShell);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(advancedBrep))
tr.RollBack();
else
tr.Commit();
return advancedBrep;
}
catch
{
return null;
}
}
}
示例5: ExportBody
//.........这里部分代码省略.........
{
HashSet<ElementId> materialIds = extrusionData.MaterialIds;
// We skip setting and getting the material id from the exporter as unnecessary.
ElementId matIdFromGeom = (materialIds != null && materialIds.Count > 0) ? materialIds.First() : ElementId.InvalidElementId;
ElementId matId = (overrideMaterialId != ElementId.InvalidElementId) ? overrideMaterialId : matIdFromGeom;
bodyItems.Add(extrusionData.BaseExtrusions[0]);
materialIdsForExtrusions.Add(matId);
if (matId != ElementId.InvalidElementId)
bodyData.AddMaterial(matId);
bodyData.RepresentationHnd = extrusionData.Handle;
bodyData.ShapeRepresentationType = extrusionData.ShapeRepresentationType;
if (exportBodyParams != null && extrusionData.Data != null)
{
exportBodyParams.Slope = extrusionData.Data.Slope;
exportBodyParams.ScaledLength = extrusionData.Data.ScaledLength;
exportBodyParams.ExtrusionDirection = extrusionData.Data.ExtrusionDirection;
exportBodyParams.ScaledHeight = extrusionData.Data.ScaledHeight;
exportBodyParams.ScaledWidth = extrusionData.Data.ScaledWidth;
exportBodyParams.ScaledArea = extrusionData.Data.ScaledArea;
exportBodyParams.ScaledInnerPerimeter = extrusionData.Data.ScaledInnerPerimeter;
exportBodyParams.ScaledOuterPerimeter = extrusionData.Data.ScaledOuterPerimeter;
}
hasExtrusions = true;
extrusionTransaction.Commit();
}
else
{
extrusionTransaction.RollBack();
}
}
}
// Only try if ExtrusionAnalyzer wasn't called, or failed.
if (!hasExtrusions)
{
// 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 geometryList)
{
faces.Add(geometryObject as Face);
}
}
// Options used if we try to export extrusions.
IFCExtrusionAxes axesToExtrudeIn = exportBodyParams != null ? exportBodyParams.PossibleExtrusionAxes : IFCExtrusionAxes.TryDefault;
XYZ directionToExtrudeIn = XYZ.Zero;
if (exportBodyParams != null && exportBodyParams.HasCustomAxis)
directionToExtrudeIn = exportBodyParams.CustomAxis;
double lengthScale = UnitUtil.ScaleLengthForRevitAPI();
IFCExtrusionCalculatorOptions extrusionOptions =
new IFCExtrusionCalculatorOptions(exporterIFC, axesToExtrudeIn, directionToExtrudeIn, lengthScale);
int numExtrusionsToCreate = allFaces ? 1 : geometryList.Count;
示例6: 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;
}
}
示例7: TryToCreateAsExtrusion
//.........这里部分代码省略.........
boundaryLoops = GetBoundaryLoopsFromBaseCurve(wallElement, connectedWalls, baseCurve, trimmedCurve, unscaledWidth, scaledDepth);
if (boundaryLoops == null || boundaryLoops.Count == 0)
return null;
expandedWallExtrusion = true;
}
else
boundaryLoops = originalBoundaryLoops;
// 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 = null;
IFCAnyHandle bodyItemHnd = null;
IFCFile file = exporterIFC.GetFile();
bool hasClipping = false;
using (IFCTransaction tr = new IFCTransaction(file))
{
baseBodyItemHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, null, boundaryLoops, wallLCS,
extrusionDir, scaledDepth);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(baseBodyItemHnd))
return null;
bodyItemHnd = AddClippingsToBaseExtrusion(exporterIFC, wallElement,
modifiedSetterOffset, range, zSpan, baseBodyItemHnd, out cutPairOpenings);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyItemHnd))
return null;
hasClipping = bodyItemHnd.Id != baseBodyItemHnd.Id;
if (expandedWallExtrusion && !hasClipping)
{
// We expanded the wall base, expecting to find cutouts, but found none. Delete the extrusion and try again below.
tr.RollBack();
baseBodyItemHnd = null;
bodyItemHnd = null;
}
else
tr.Commit();
}
// We created an extrusion, but we determined that it was too big (there were no cutouts). So try again with our first guess.
if (IFCAnyHandleUtil.IsNullOrHasNoValue(bodyItemHnd))
{
baseBodyItemHnd = bodyItemHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, null, originalBoundaryLoops, wallLCS,
extrusionDir, scaledDepth);
}
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)
{
// Check whether wall has opening. If it has, exporting it in Reference View will need to be in a tesselated geometry that includes the opening cut
if (ExporterCacheManager.ExportOptionsCache.ExportAs4ReferenceView && wallHasOpening)
{
示例8: ExportBody
//.........这里部分代码省略.........
{
IFCAnyHandle sweptHandle = sweptSolidExporter.RepresentationItem;
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(sweptHandle))
{
bodyItems.Add(sweptHandle);
materialIdsForExtrusions.Add(exporterIFC.GetMaterialIdForCurrentExportState());
exported = true;
if (sweptSolidExporter.IsExtrusion)
hasExtrusions = true;
else
hasSweptSolids = true;
}
}
}
if (!exported)
exportAsBRep.Add(ii);
}
}
bool exportSucceeded = (exportAsBRep.Count == 0) && (tryToExportAsExtrusion || tryToExportAsSweptSolid) && (hasExtrusions || hasSweptSolids);
if (exportSucceeded || canExportSolidModelRep)
{
int sz = bodyItems.Count();
for (int ii = 0; ii < sz; ii++)
BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document, bodyItems[ii], materialIdsForExtrusions[ii]);
if (exportSucceeded)
{
if (hasExtrusions && !hasSweptSolids)
{
bodyData.RepresentationHnd =
RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, categoryId, contextOfItems, bodyItems, bodyData.RepresentationHnd);
bodyData.ShapeRepresentationType = ShapeRepresentationType.SweptSolid;
}
else if (hasSweptSolids && !hasExtrusions)
{
bodyData.RepresentationHnd =
RepresentationUtil.CreateAdvancedSweptSolidRep(exporterIFC, element, categoryId, contextOfItems, bodyItems, bodyData.RepresentationHnd);
bodyData.ShapeRepresentationType = ShapeRepresentationType.AdvancedSweptSolid;
}
else
{
bodyData.RepresentationHnd =
RepresentationUtil.CreateSolidModelRep(exporterIFC, element, categoryId, contextOfItems, bodyItems);
bodyData.ShapeRepresentationType = ShapeRepresentationType.SolidModel;
}
// TODO: include BRep, CSG, Clipping
tr.Commit();
return bodyData;
}
}
// If we are going to export a solid model, keep the created items.
if (!canExportSolidModelRep)
{
tr.RollBack();
// Revert to the original local placement, and re-set the relative placement, as the rollback may delete either.
if (localPlacementBackup != null)
{
IFCAnyHandle origLocalPlacement = localPlacementBackup.Restore();
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(origLocalPlacement))
exportBodyParams.SetLocalPlacement(origLocalPlacement);
}
}
else
tr.Commit();
}
// We couldn't export it as an extrusion; export as a solid, brep, or a surface model.
if (!canExportSolidModelRep)
{
exportAsExtrusion.Clear();
bodyItems.Clear();
if (exportBodyParams != null)
exportBodyParams.ClearOpenings();
}
if (exportAsExtrusion.Count == 0)
exportAsBRep.Clear();
}
using (IFCTransaction tr = new IFCTransaction(file))
{
using (IFCTransformSetter transformSetter = IFCTransformSetter.Create())
{
if (exportBodyParams != null && (exportAsBRep.Count == 0))
bodyData.OffsetTransform = transformSetter.InitializeFromBoundingBox(exporterIFC, geometryList, exportBodyParams);
BodyData retBodyData = ExportBodyAsBRep(exporterIFC, geometryList, exportAsBRep, bodyItems, element, categoryId, overrideMaterialId, contextOfItems, eps, options, bodyData);
if (retBodyData != null)
tr.Commit();
else
tr.RollBack();
return retBodyData;
}
}
}
示例9: CreateExtrusionWithClippingBase
//.........这里部分代码省略.........
// Move base plane to start parameter location.
Plane extrusionBasePlane = null;
try
{
extrusionBasePlane = extrusionBoundaryLoops[0].GetPlane();
}
catch
{
return nullVal;
}
double extrusionLength = elementAnalyzer.EndParameter - elementAnalyzer.StartParameter;
double baseOffset = extrusionBasePlane.Origin.DotProduct(projDir);
IFCRange extrusionRange = new IFCRange(baseOffset, extrusionLength + baseOffset);
double startParam = planeOrig.DotProduct(projDir);
double endParam = planeOrig.DotProduct(projDir) + extrusionLength;
if ((range != null) && (startParam >= range.End || endParam <= range.Start))
{
completelyClipped = true;
return nullVal;
}
double scaledExtrusionDepth = extrusionLength * scale;
string profileName = null;
if (element != null)
{
ElementType type = element.Document.GetElement(element.GetTypeId()) as ElementType;
if (type != null)
profileName = type.Name;
}
// We use a sub-transaction here in case we are able to generate the base body but not the clippings.
IFCFile file = exporterIFC.GetFile();
using (IFCTransaction tr = new IFCTransaction(file))
{
// For creating the actual extrusion, we want to use the calculated extrusion plane, not the input plane.
IFCAnyHandle extrusionBodyItemHnd = ExtrusionExporter.CreateExtrudedSolidFromCurveLoop(exporterIFC, profileName,
extrusionBoundaryLoops, extrusionBasePlane, projDir, scaledExtrusionDepth);
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(extrusionBodyItemHnd))
{
IFCAnyHandle finalExtrusionBodyItemHnd = extrusionBodyItemHnd;
IDictionary<ElementId, ICollection<ICollection<Face>>> elementCutouts =
GeometryUtil.GetCuttingElementFaces(element, elementAnalyzer);
foreach (KeyValuePair<ElementId, ICollection<ICollection<Face>>> elementCutoutsForElement in elementCutouts)
{
Element cuttingElement = document.GetElement(elementCutoutsForElement.Key);
foreach (ICollection<Face> elementCutout in elementCutoutsForElement.Value)
{
bool unhandledClipping = false;
try
{
finalExtrusionBodyItemHnd = GeometryUtil.ProcessFaceCollection(exporterIFC, cuttingElement,
extrusionBasePlane, projDir,
elementCutout, extrusionRange, finalExtrusionBodyItemHnd);
}
catch
{
unhandledClipping = true;
}
if (finalExtrusionBodyItemHnd == null || unhandledClipping)
{
// Item is completely clipped.
completelyClipped = (finalExtrusionBodyItemHnd == null);
tr.RollBack();
return nullVal;
}
}
}
IFCAnyHandle extrusionStyledItemHnd = BodyExporter.CreateSurfaceStyleForRepItem(exporterIFC, document,
extrusionBodyItemHnd, ElementId.InvalidElementId);
HashSet<IFCAnyHandle> extrusionBodyItems = new HashSet<IFCAnyHandle>();
extrusionBodyItems.Add(finalExtrusionBodyItemHnd);
if (extrusionBodyItemHnd == finalExtrusionBodyItemHnd)
{
bodyRep = RepresentationUtil.CreateSweptSolidRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBodyItems, null);
}
else
{
bodyRep = RepresentationUtil.CreateClippingRep(exporterIFC, element, catId, contextOfItemsBody,
extrusionBodyItems);
}
}
tr.Commit();
}
retVal.Handle = bodyRep;
return retVal;
}
catch
{
return nullVal;
}
}
示例10: 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;
HandleAndAnalyzer currRetVal = CreateExtrusionWithClippingAndOpening(exporterIFC, element, catId, solid, plane, projDir, range,
out completelyClipped, out hasClippingResult, out hasBooleanResult, out materialId);
if (currRetVal != null && currRetVal.Handle != null)
{
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");
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
{
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);
retVal.ShapeRepresentationType = ShapeRepresentationType.CSG;
}
tr.Commit();
return retVal;
}
}