本文整理汇总了C#中Transform.Multiply方法的典型用法代码示例。如果您正苦于以下问题:C# Transform.Multiply方法的具体用法?C# Transform.Multiply怎么用?C# Transform.Multiply使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Transform
的用法示例。
在下文中一共展示了Transform.Multiply方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetTransformedCurveLoopsFromSimpleProfile
private IList<CurveLoop> GetTransformedCurveLoopsFromSimpleProfile(IFCSimpleProfile simpleSweptArea, Transform lcs)
{
IList<CurveLoop> loops = new List<CurveLoop>();
// It is legal for simpleSweptArea.Position to be null, for example for IfcArbitraryClosedProfileDef.
Transform sweptAreaPosition =
(simpleSweptArea.Position == null) ? lcs : lcs.Multiply(simpleSweptArea.Position);
CurveLoop currLoop = simpleSweptArea.OuterCurve;
if (currLoop == null || currLoop.Count() == 0)
{
IFCImportFile.TheLog.LogError(simpleSweptArea.Id, "No outer curve loop for profile, ignoring.", false);
return null;
}
loops.Add(IFCGeometryUtil.CreateTransformed(currLoop, sweptAreaPosition));
if (simpleSweptArea.InnerCurves != null)
{
foreach (CurveLoop innerCurveLoop in simpleSweptArea.InnerCurves)
loops.Add(IFCGeometryUtil.CreateTransformed(innerCurveLoop, sweptAreaPosition));
}
return loops;
}
示例2: ExportFamilyInstanceAsMappedItem
//.........这里部分代码省略.........
(exportType == IFCExportType.ExportMemberType))
{
typeInfo.ScaledArea = extraParams.ScaledArea;
typeInfo.ScaledDepth = extraParams.ScaledLength;
typeInfo.ScaledInnerPerimeter = extraParams.ScaledInnerPerimeter;
typeInfo.ScaledOuterPerimeter = extraParams.ScaledOuterPerimeter;
}
ClassificationUtil.CreateUniformatClassification(exporterIFC, file, familySymbol, typeStyle);
}
}
else if (!creatingType && (trySpecialColumnCreation))
{
// still need to modify instance trf for columns.
trf.Origin += GetLevelOffsetForExtrudedColumns(exporterIFC, familyInstance, overrideLevelId, extraParams);
}
if (found && !typeInfo.IsValid())
{
typeInfo = currentTypeInfo;
}
// we'll pretend we succeeded, but we'll do nothing.
if (!typeInfo.IsValid())
return;
// add to the map, as long as we are not using range, not using instance geometry, and don't have extra openings.
if ((range == null) && !useInstanceGeometry && (extraParams.GetOpenings().Count == 0))
ExporterCacheManager.TypeObjectsCache.Register(familySymbol.Id, flipped, typeInfo);
Transform oldTrf = new Transform(trf);
XYZ scaledMapOrigin = XYZ.Zero;
trf = trf.Multiply(typeInfo.StyleTransform);
// create instance.
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
{
IFCAnyHandle contextOfItems2d = exporterIFC.Get2DContextHandle();
IFCAnyHandle contextOfItems3d = exporterIFC.Get3DContextHandle("Body");
// for proxies, we store the IfcRepresentationMap directly since there is no style.
IFCAnyHandle style = typeInfo.Style;
IList<IFCAnyHandle> repMapList = !IFCAnyHandleUtil.IsNullOrHasNoValue(style) ?
GeometryUtil.GetRepresentationMaps(style) : null;
int numReps = repMapList != null ? repMapList.Count : 0;
IFCAnyHandle repMap2dHnd = typeInfo.Map2DHandle;
IFCAnyHandle repMap3dHnd = typeInfo.Map3DHandle;
if (IFCAnyHandleUtil.IsNullOrHasNoValue(repMap3dHnd) && (numReps > 0))
repMap3dHnd = repMapList[0];
if (IFCAnyHandleUtil.IsNullOrHasNoValue(repMap2dHnd) && (numReps > 1))
repMap2dHnd = repMapList[1];
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(repMap3dHnd))
{
IList<IFCAnyHandle> representations = new List<IFCAnyHandle>();
representations.Add(ExporterUtil.CreateDefaultMappedItem(file, repMap3dHnd, scaledMapOrigin));
IFCAnyHandle shapeRep = RepresentationUtil.CreateBodyMappedItemRep(exporterIFC, familyInstance, categoryId, contextOfItems3d,
representations);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(shapeRep))
return;
shapeReps.Add(shapeRep);
}
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(repMap2dHnd))
示例3: CreateGeometryInternal
/// <summary>
/// Return geometry for a particular representation item.
/// </summary>
/// <param name="shapeEditScope">The geometry creation scope.</param>
/// <param name="lcs">Local coordinate system for the geometry.</param>
/// <param name="guid">The guid of an element for which represntation is being created.</param>
/// <returns>The created geometry.</returns>
protected override IList<GeometryObject> CreateGeometryInternal(
IFCImportShapeEditScope shapeEditScope, Transform lcs, Transform scaledLcs, string guid)
{
Transform objectPosition = (lcs == null) ? Position : lcs.Multiply(Position);
CurveLoop baseProfileCurve = Directrix.GetCurveLoop();
if (baseProfileCurve == null)
return null;
CurveLoop trimmedDirectrix = IFCGeometryUtil.TrimCurveLoop(baseProfileCurve, StartParameter, EndParameter);
if (trimmedDirectrix == null)
return null;
CurveLoop trimmedDirectrixInLCS = IFCGeometryUtil.CreateTransformed(trimmedDirectrix, objectPosition);
// Create the sweep.
double startParam = 0.0; // If the directrix isn't bound, this arbitrary parameter will do.
Transform originTrf = null;
Curve firstCurve = trimmedDirectrixInLCS.First();
if (firstCurve.IsBound)
startParam = firstCurve.GetEndParameter(0);
originTrf = firstCurve.ComputeDerivatives(startParam, false);
if (originTrf == null)
return null;
Transform referenceSurfaceLocalTransform = ReferenceSurface.GetTransformAtPoint(originTrf.Origin);
Transform referenceSurfaceTransform = objectPosition.Multiply(referenceSurfaceLocalTransform);
Transform profileCurveLoopsTransform = Transform.CreateTranslation(originTrf.Origin);
profileCurveLoopsTransform.BasisX = referenceSurfaceTransform.BasisZ;
profileCurveLoopsTransform.BasisZ = originTrf.BasisX.Normalize();
profileCurveLoopsTransform.BasisY = profileCurveLoopsTransform.BasisZ.CrossProduct(profileCurveLoopsTransform.BasisX);
ISet<IList<CurveLoop>> profileCurveLoops = GetTransformedCurveLoops(profileCurveLoopsTransform);
if (profileCurveLoops == null || profileCurveLoops.Count == 0)
return null;
SolidOptions solidOptions = new SolidOptions(GetMaterialElementId(shapeEditScope), shapeEditScope.GraphicsStyleId);
IList<GeometryObject> myObjs = new List<GeometryObject>();
foreach (IList<CurveLoop> loops in profileCurveLoops)
{
GeometryObject myObj = GeometryCreationUtilities.CreateSweptGeometry(trimmedDirectrixInLCS, 0, startParam, loops, solidOptions);
if (myObj != null)
myObjs.Add(myObj);
}
return myObjs;
}
示例4: CreateSolidFromBoundingBox
/// <summary>
/// Return a solid corresponding to the volume represented by boundingBoxXYZ.
/// </summary>
/// <param name="lcs">The local coordinate system of the bounding box; if null, assume the Identity transform.</param>
/// <param name="boundingBoxXYZ">The bounding box.</param>
/// <param name="solidOptions">The options for creating the solid. Allow null to mean default.</param>
/// <returns>A solid of the same size and orientation as boundingBoxXYZ, or null if boundingBoxXYZ is invalid or null.</returns>
/// <remarks>We don't do any checking on the input transform, which could have non-uniform scaling and/or mirroring.
/// This could potentially lead to unexpected results, which we can examine if and when such cases arise.</remarks>
public static Solid CreateSolidFromBoundingBox(Transform lcs, BoundingBoxXYZ boundingBoxXYZ, SolidOptions solidOptions)
{
// Check that the bounding box is valid.
if (boundingBoxXYZ == null || !boundingBoxXYZ.Enabled)
return null;
try
{
// Create a transform based on the incoming local coordinate system and the bounding box coordinate system.
Transform bboxTransform = (lcs == null) ? boundingBoxXYZ.Transform : lcs.Multiply(boundingBoxXYZ.Transform);
XYZ[] profilePts = new XYZ[4];
profilePts[0] = bboxTransform.OfPoint(boundingBoxXYZ.Min);
profilePts[1] = bboxTransform.OfPoint(new XYZ(boundingBoxXYZ.Max.X, boundingBoxXYZ.Min.Y, boundingBoxXYZ.Min.Z));
profilePts[2] = bboxTransform.OfPoint(new XYZ(boundingBoxXYZ.Max.X, boundingBoxXYZ.Max.Y, boundingBoxXYZ.Min.Z));
profilePts[3] = bboxTransform.OfPoint(new XYZ(boundingBoxXYZ.Min.X, boundingBoxXYZ.Max.Y, boundingBoxXYZ.Min.Z));
XYZ upperRightXYZ = bboxTransform.OfPoint(boundingBoxXYZ.Max);
// If we assumed that the transforms had no scaling,
// then we could simply take boundingBoxXYZ.Max.Z - boundingBoxXYZ.Min.Z.
// This code removes that assumption.
XYZ origExtrusionVector = new XYZ(boundingBoxXYZ.Min.X, boundingBoxXYZ.Min.Y, boundingBoxXYZ.Max.Z) - boundingBoxXYZ.Min;
XYZ extrusionVector = bboxTransform.OfVector(origExtrusionVector);
double extrusionDistance = extrusionVector.GetLength();
XYZ extrusionDirection = extrusionVector.Normalize();
CurveLoop baseLoop = new CurveLoop();
for (int ii = 0; ii < 4; ii++)
{
baseLoop.Append(Line.CreateBound(profilePts[ii], profilePts[(ii + 1) % 4]));
}
IList<CurveLoop> baseLoops = new List<CurveLoop>();
baseLoops.Add(baseLoop);
if (solidOptions == null)
return GeometryCreationUtilities.CreateExtrusionGeometry(baseLoops, extrusionDirection, extrusionDistance);
else
return GeometryCreationUtilities.CreateExtrusionGeometry(baseLoops, extrusionDirection, extrusionDistance, solidOptions);
}
catch
{
return null;
}
}
示例5: CreateShapeInternal
/// <summary>
/// Create geometry for a particular representation item.
/// </summary>
/// <param name="shapeEditScope">The geometry creation scope.</param>
/// <param name="lcs">Local coordinate system for the geometry, without scale.</param>
/// <param name="scaledLcs">Local coordinate system for the geometry, including scale, potentially non-uniform.</param>
/// <param name="guid">The guid of an element for which represntation is being created.</param>
protected override void CreateShapeInternal(IFCImportShapeEditScope shapeEditScope, Transform lcs, Transform scaledLcs, string guid)
{
base.CreateShapeInternal(shapeEditScope, lcs, scaledLcs, guid);
// Check scale; if it is uniform, create an instance. If not, create a shape directly.
// TODO: Instead allow creation of instances based on similar scaling.
double scaleX = MappingTarget.Scale;
double scaleY = MappingTarget.ScaleY.HasValue ? MappingTarget.ScaleY.Value : scaleX;
double scaleZ = MappingTarget.ScaleZ.HasValue ? MappingTarget.ScaleZ.Value : scaleX;
bool isUnitScale = (MathUtil.IsAlmostEqual(scaleX, 1.0) &&
MathUtil.IsAlmostEqual(scaleY, 1.0) &&
MathUtil.IsAlmostEqual(scaleZ, 1.0));
Transform mappingTransform = MappingTarget.Transform;
Transform newLcs = null;
if (lcs == null)
newLcs = mappingTransform;
else if (mappingTransform == null)
newLcs = lcs;
else
newLcs = lcs.Multiply(mappingTransform);
Transform newScaledLcs = null;
if (scaledLcs == null)
newScaledLcs = mappingTransform;
else if (mappingTransform == null)
newScaledLcs = scaledLcs;
else
newScaledLcs = scaledLcs.Multiply(mappingTransform);
// Pass in newLCS = null, use newLCS for instance.
bool isFootprint = (shapeEditScope.ContainingRepresentation.Identifier == IFCRepresentationIdentifier.FootPrint);
bool canCreateType = (newLcs != null && newLcs.IsConformal) &&
(newScaledLcs != null && newScaledLcs.IsConformal) &&
isUnitScale &&
(shapeEditScope.ContainingRepresentation != null && !isFootprint);
if (canCreateType)
{
MappingSource.CreateShape(shapeEditScope, null, null, guid);
IList<GeometryObject> instances = DirectShape.CreateGeometryInstance(shapeEditScope.Document, MappingSource.Id.ToString(), newLcs);
foreach (GeometryObject instance in instances)
shapeEditScope.AddGeometry(IFCSolidInfo.Create(Id, instance));
}
else
{
if (!isUnitScale)
{
XYZ xScale = new XYZ(scaleX, 0.0, 0.0);
XYZ yScale = new XYZ(0.0, scaleY, 0.0);
XYZ zScale = new XYZ(0.0, 0.0, scaleZ);
Transform scaleTransform = Transform.Identity;
scaleTransform.set_Basis(0, xScale);
scaleTransform.set_Basis(1, yScale);
scaleTransform.set_Basis(2, zScale);
newScaledLcs = newScaledLcs.Multiply(scaleTransform);
}
MappingSource.CreateShape(shapeEditScope, newLcs, newScaledLcs, guid);
}
}
示例6: ExportFamilyInstanceAsMappedItem
//.........这里部分代码省略.........
{
if (((exportType == IFCExportType.ExportColumnType) && trySpecialColumnCreation) ||
(exportType == IFCExportType.ExportMemberType))
{
typeInfo.ScaledArea = extraParams.ScaledArea;
typeInfo.ScaledDepth = extraParams.ScaledLength;
typeInfo.ScaledInnerPerimeter = extraParams.ScaledInnerPerimeter;
typeInfo.ScaledOuterPerimeter = extraParams.ScaledOuterPerimeter;
}
}
}
else if (!creatingType && (trySpecialColumnCreation))
{
// still need to modify instance trf for columns.
trf.Origin += GetLevelOffsetForExtrudedColumns(exporterIFC, familyInstance, overrideLevelId, extraParams);
}
if (found && !typeInfo.GetStyle().HasValue)
{
typeInfo = currentTypeInfo;
}
// we'll pretend we succeeded, but we'll do nothing.
if (!typeInfo.GetStyle().HasValue && !typeInfo.Get2DMapHandle().HasValue && !typeInfo.Get3DMapHandle().HasValue)
return;
// add to the map, as long as we are not using range, not using instance geometry, and don't have extra openings.
if ((range == null) && !useInstanceGeometry && (extraParams.GetOpenings().Count == 0))
exporterIFC.AddType(familySymbol.Id, flipped, typeInfo);
Transform oldTrf = new Transform(trf);
XYZ scaledMapOrigin = XYZ.Zero;
trf = trf.Multiply(typeInfo.GetStyleTransform());
// create instance.
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
{
IFCAnyHandle contextOfItems2d = exporterIFC.Get2DContextHandle();
IFCAnyHandle contextOfItems3d = exporterIFC.Get3DContextHandle();
// for proxies, we store the IfcRepresentationMap directly since there is no style.
IList<IFCAnyHandle> repMapList = IFCGeometryUtils.GetRepresentationMaps(typeInfo.GetStyle());
int numReps = repMapList.Count;
IFCAnyHandle repMap2dHnd = typeInfo.Get2DMapHandle();
IFCAnyHandle repMap3dHnd = typeInfo.Get3DMapHandle();
if (!repMap3dHnd.HasValue && (numReps > 0))
repMap3dHnd = repMapList[0];
if (!repMap2dHnd.HasValue && (numReps > 1))
repMap2dHnd = repMapList[1];
if (repMap3dHnd.HasValue)
{
HashSet<IFCAnyHandle> representations = new HashSet<IFCAnyHandle>();
representations.Add(ExporterUtil.CreateDefaultMappedItem(file, repMap3dHnd, scaledMapOrigin));
IFCAnyHandle shapeRep = RepresentationUtil.CreateBodyMappedItemRep(exporterIFC, categoryId, contextOfItems3d, representations);
if (!shapeRep.HasValue)
return;
shapeReps.Add(shapeRep);
}
if (repMap2dHnd.HasValue)
{
HashSet<IFCAnyHandle> representations = new HashSet<IFCAnyHandle>();
representations.Add(ExporterUtil.CreateDefaultMappedItem(file, repMap2dHnd, scaledMapOrigin));
示例7: ExportFamilyInstanceAsMappedItem
//.........这里部分代码省略.........
typeInfo.ScaledOuterPerimeter = extraParams.ScaledOuterPerimeter;
}
ClassificationUtil.CreateClassification(exporterIFC, file, familySymbol, typeStyle); // Create other generic classification from ClassificationCode(s)
ClassificationUtil.CreateUniformatClassification(exporterIFC, file, originalFamilySymbol, typeStyle);
}
}
if (found && !typeInfo.IsValid())
typeInfo = currentTypeInfo;
// we'll pretend we succeeded, but we'll do nothing.
if (!typeInfo.IsValid())
return;
// add to the map, as long as we are not using range, not using instance geometry, and don't have extra openings.
if ((range == null) && !useInstanceGeometry && (extraParams.GetOpenings().Count == 0))
ExporterCacheManager.TypeObjectsCache.Register(originalFamilySymbol.Id, flipped, typeInfo);
// If we are using the instance geometry, ignore the transformation.
if (useInstanceGeometry)
trf = Transform.Identity;
if ((range != null) && exportParts)
{
XYZ rangeOffset = trf.Origin;
rangeOffset += new XYZ(0, 0, range.Start);
trf.Origin = rangeOffset;
}
Transform originalTrf = new Transform(trf);
XYZ scaledMapOrigin = XYZ.Zero;
trf = trf.Multiply(typeInfo.StyleTransform);
// create instance.
IList<IFCAnyHandle> shapeReps = new List<IFCAnyHandle>();
{
IFCAnyHandle contextOfItems2d = exporterIFC.Get2DContextHandle();
IFCAnyHandle contextOfItems3d = exporterIFC.Get3DContextHandle("Body");
// for proxies, we store the IfcRepresentationMap directly since there is no style.
IFCAnyHandle style = typeInfo.Style;
IList<IFCAnyHandle> repMapList = !IFCAnyHandleUtil.IsNullOrHasNoValue(style) ?
GeometryUtil.GetRepresentationMaps(style) : null;
int numReps = repMapList != null ? repMapList.Count : 0;
IFCAnyHandle repMap2dHnd = typeInfo.Map2DHandle;
IFCAnyHandle repMap3dHnd = typeInfo.Map3DHandle;
if (IFCAnyHandleUtil.IsNullOrHasNoValue(repMap3dHnd) && (numReps > 0))
repMap3dHnd = repMapList[0];
if (IFCAnyHandleUtil.IsNullOrHasNoValue(repMap2dHnd) && (numReps > 1))
repMap2dHnd = repMapList[1];
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(repMap3dHnd))
{
IList<IFCAnyHandle> representations = new List<IFCAnyHandle>();
representations.Add(ExporterUtil.CreateDefaultMappedItem(file, repMap3dHnd, scaledMapOrigin));
IFCAnyHandle shapeRep = RepresentationUtil.CreateBodyMappedItemRep(exporterIFC, familyInstance, categoryId, contextOfItems3d,
representations);
if (IFCAnyHandleUtil.IsNullOrHasNoValue(shapeRep))
return;
shapeReps.Add(shapeRep);
}
if (!IFCAnyHandleUtil.IsNullOrHasNoValue(repMap2dHnd))
示例8: ScanGeometryInstance
/// <summary>
/// Scan GeometryInstance to collect triangles.
/// </summary>
/// <param name="instance">The geometry instance.</param>
/// <param name="trf">The transformation.</param>
private void ScanGeometryInstance(Document document, GeometryInstance instance, Transform transform)
{
GeometryElement instanceGeometry = instance.SymbolGeometry;
if (null == instanceGeometry)
{
return;
}
Transform newTransform;
if (null == transform)
{
newTransform = instance.Transform;
}
else
{
newTransform = transform.Multiply(instance.Transform); // get a transformation of the affine 3-space
}
// get all geometric primitives contained in the GeometryElement
ScanGeomElement(document,instanceGeometry, newTransform);
}
示例9: CreateShape
/// <summary>
/// Create geometry for a particular representation map.
/// </summary>
/// <param name="shapeEditScope">The geometry creation scope.</param>
/// <param name="lcs">Local coordinate system for the geometry, without scale.</param>
/// <param name="scaledLcs">Local coordinate system for the geometry, including scale, potentially non-uniform.</param>
/// <remarks>For this function, if lcs is null, we will create a library item for the geometry.</remarks>
public void CreateShape(IFCImportShapeEditScope shapeEditScope, Transform lcs, Transform scaledLcs, string guid)
{
bool creatingLibraryDefinition = (lcs == null);
if (MappedRepresentation != null)
{
// Look for cached shape; if found, return.
if (creatingLibraryDefinition)
{
if (IFCImportFile.TheFile.ShapeLibrary.FindDefinitionType(Id.ToString()) != ElementId.InvalidElementId)
return;
}
Transform mappingTransform = null;
if (lcs == null)
mappingTransform = MappingOrigin;
else
{
if (MappingOrigin == null)
mappingTransform = lcs;
else
mappingTransform = lcs.Multiply(MappingOrigin);
}
Transform scaledMappingTransform = null;
if (scaledLcs == null)
scaledMappingTransform = mappingTransform;
else
{
if (MappingOrigin == null)
scaledMappingTransform = scaledLcs;
else
scaledMappingTransform = scaledLcs.Multiply(MappingOrigin);
}
int numExistingSolids = shapeEditScope.Creator.Solids.Count;
int numExistingCurves = shapeEditScope.Creator.FootprintCurves.Count;
MappedRepresentation.CreateShape(shapeEditScope, mappingTransform, scaledMappingTransform, guid);
if (creatingLibraryDefinition)
{
int numNewSolids = shapeEditScope.Creator.Solids.Count;
int numNewCurves = shapeEditScope.Creator.FootprintCurves.Count;
if ((numExistingSolids != numNewSolids) || (numExistingCurves != numNewCurves))
{
IList<GeometryObject> mappedSolids = new List<GeometryObject>();
for (int ii = numExistingSolids; ii < numNewSolids; ii++)
{
mappedSolids.Add(shapeEditScope.Creator.Solids[numExistingSolids].GeometryObject);
shapeEditScope.Creator.Solids.RemoveAt(numExistingSolids);
}
IList<Curve> mappedCurves = new List<Curve>();
for (int ii = numExistingCurves; ii < numNewCurves; ii++)
{
mappedCurves.Add(shapeEditScope.Creator.FootprintCurves[numExistingCurves]);
shapeEditScope.Creator.FootprintCurves.RemoveAt(numExistingCurves);
}
shapeEditScope.AddPlanViewCurves(mappedCurves, Id);
//IFCImportFile.TheFile.ShapeLibrary.AddDefinition(Id.ToString(), mappedItems);
Document doc = IFCImportFile.TheFile.Document;
DirectShapeType directShapeType = DirectShapeType.Create(doc, Id.ToString(), shapeEditScope.CategoryId);
directShapeType.SetShape(mappedSolids);
shapeEditScope.SetPlanViewRep(directShapeType);
IFCImportFile.TheFile.ShapeLibrary.AddDefinitionType(Id.ToString(), directShapeType.Id);
}
}
}
}
示例10: CreateGeometryInternal
/// <summary>
/// Create geometry for an IfcHalfSpaceSolid.
/// </summary>
/// <param name="shapeEditScope">The shape edit scope.</param>
/// <param name="lcs">Local coordinate system for the geometry, without scale.</param>
/// <param name="scaledLcs">Local coordinate system for the geometry, including scale, potentially non-uniform.</param>
/// <param name="guid">The guid of an element for which represntation is being created.</param>
/// <returns>A list containing one geometry for the IfcHalfSpaceSolid.</returns>
protected virtual IList<GeometryObject> CreateGeometryInternal(
IFCImportShapeEditScope shapeEditScope, Transform lcs, Transform scaledLcs, string guid)
{
IFCPlane ifcPlane = BaseSurface as IFCPlane;
Plane plane = ifcPlane.Plane;
XYZ origin = plane.Origin;
XYZ xVec = plane.XVec;
XYZ yVec = plane.YVec;
// Set some huge boundaries for now.
const double largeCoordinateValue = 100000;
XYZ[] corners = new XYZ[4] {
lcs.OfPoint((xVec * -largeCoordinateValue) + (yVec * -largeCoordinateValue) + origin),
lcs.OfPoint((xVec * largeCoordinateValue) + (yVec * -largeCoordinateValue) + origin),
lcs.OfPoint((xVec * largeCoordinateValue) + (yVec * largeCoordinateValue) + origin),
lcs.OfPoint((xVec * -largeCoordinateValue) + (yVec * largeCoordinateValue) + origin)
};
IList<CurveLoop> loops = new List<CurveLoop>();
CurveLoop loop = new CurveLoop();
for (int ii = 0; ii < 4; ii++)
{
if (AgreementFlag)
loop.Append(Line.CreateBound(corners[(5 - ii) % 4], corners[(4 - ii) % 4]));
else
loop.Append(Line.CreateBound(corners[ii], corners[(ii + 1) % 4]));
}
loops.Add(loop);
XYZ normal = lcs.OfVector(AgreementFlag ? -plane.Normal : plane.Normal);
SolidOptions solidOptions = new SolidOptions(GetMaterialElementId(shapeEditScope), shapeEditScope.GraphicsStyleId);
Solid baseSolid = GeometryCreationUtilities.CreateExtrusionGeometry(loops, normal, largeCoordinateValue, solidOptions);
if (BaseBoundingCurve != null)
{
CurveLoop polygonalBoundary = BaseBoundingCurve.CurveLoop;
Transform totalTransform = lcs.Multiply(BaseBoundingCurveTransform);
// Make sure this bounding polygon extends below base of half-space soild.
Transform moveBaseTransform = Transform.Identity;
moveBaseTransform.Origin = new XYZ(0, 0, -largeCoordinateValue);
totalTransform = totalTransform.Multiply(moveBaseTransform);
CurveLoop transformedPolygonalBoundary = IFCGeometryUtil.CreateTransformed(polygonalBoundary, totalTransform);
IList<CurveLoop> boundingLoops = new List<CurveLoop>();
boundingLoops.Add(transformedPolygonalBoundary);
Solid boundingSolid = GeometryCreationUtilities.CreateExtrusionGeometry(boundingLoops, totalTransform.BasisZ, 2.0 * largeCoordinateValue,
solidOptions);
baseSolid = IFCGeometryUtil.ExecuteSafeBooleanOperation(Id, BaseBoundingCurve.Id, baseSolid, boundingSolid, BooleanOperationsType.Intersect, null);
}
IList<GeometryObject> returnList = new List<GeometryObject>();
returnList.Add(baseSolid);
return returnList;
}