本文整理汇总了C#中Element.GetGeneratingElementIds方法的典型用法代码示例。如果您正苦于以下问题:C# Element.GetGeneratingElementIds方法的具体用法?C# Element.GetGeneratingElementIds怎么用?C# Element.GetGeneratingElementIds使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Element
的用法示例。
在下文中一共展示了Element.GetGeneratingElementIds方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetCuttingElementFaces
/// <summary>
/// Group the extra faces in the extrusion by element id, representing clippings, recesses, and openings.
/// </summary>
/// <param name="elem">The element generating the base extrusion.</param>
/// <param name="analyzer">The extrusion analyzer.</param>
/// <returns>A list of connected faces for each element id that cuts the extrusion</returns>
public static IDictionary<ElementId, ICollection<ICollection<Face>>> GetCuttingElementFaces(Element elem, ExtrusionAnalyzer analyzer)
{
IDictionary<ElementId, HashSet<Face>> cuttingElementFaces = new Dictionary<ElementId, HashSet<Face>>();
IDictionary<Face, ExtrusionAnalyzerFaceAlignment> allFaces = analyzer.CalculateFaceAlignment();
foreach (KeyValuePair<Face, ExtrusionAnalyzerFaceAlignment> currFace in allFaces)
{
if (currFace.Value == ExtrusionAnalyzerFaceAlignment.FullyAligned)
continue;
EdgeArrayArray faceEdges = currFace.Key.EdgeLoops;
int numBoundaries = faceEdges.Size;
if (numBoundaries == 0)
continue;
if (numBoundaries > 1)
throw new Exception("Can't handle faces with interior boundaries.");
ICollection<ElementId> generatingElementIds = elem.GetGeneratingElementIds(currFace.Key);
foreach (ElementId generatingElementId in generatingElementIds)
{
HashSet<Face> elementFaces;
if (cuttingElementFaces.ContainsKey(generatingElementId))
{
elementFaces = cuttingElementFaces[generatingElementId];
}
else
{
elementFaces = new HashSet<Face>();
cuttingElementFaces[generatingElementId] = elementFaces;
}
elementFaces.Add(currFace.Key);
}
}
IDictionary<ElementId, ICollection<ICollection<Face>>> cuttingElementFaceCollections =
new Dictionary<ElementId, ICollection<ICollection<Face>>>();
foreach (KeyValuePair<ElementId, HashSet<Face>> cuttingElementFaceCollection in cuttingElementFaces)
{
ICollection<ICollection<Face>> faceCollections = new List<ICollection<Face>>();
// Split into separate collections based on connectivity.
while (cuttingElementFaceCollection.Value.Count > 0)
{
IList<Face> currCollection = new List<Face>();
IEnumerator<Face> cuttingElementFaceCollectionEnumerator = cuttingElementFaceCollection.Value.GetEnumerator();
cuttingElementFaceCollectionEnumerator.MoveNext();
Face currFace = cuttingElementFaceCollectionEnumerator.Current;
currCollection.Add(currFace);
cuttingElementFaceCollection.Value.Remove(currFace);
IList<Face> facesToProcess = new List<Face>();
facesToProcess.Add(currFace);
if (cuttingElementFaceCollection.Value.Count > 0)
{
while (facesToProcess.Count > 0)
{
currFace = facesToProcess[0];
EdgeArray faceOuterBoundary = currFace.EdgeLoops.get_Item(0);
foreach (Edge edge in faceOuterBoundary)
{
Face adjoiningFace = edge.get_Face(1);
if (adjoiningFace.Equals(currFace))
adjoiningFace = edge.get_Face(0);
if (cuttingElementFaceCollection.Value.Contains(adjoiningFace))
{
currCollection.Add(adjoiningFace);
cuttingElementFaceCollection.Value.Remove(adjoiningFace);
facesToProcess.Add(adjoiningFace);
}
}
facesToProcess.Remove(facesToProcess[0]);
}
}
faceCollections.Add(currCollection);
}
cuttingElementFaceCollections[cuttingElementFaceCollection.Key] = faceCollections;
}
return cuttingElementFaceCollections;
}
示例2: ProcessGroupMembership
private static bool ProcessGroupMembership(ExporterIFC exporterIFC, IFCFile file, Element element, ElementId categoryId, IFCAnyHandle contextOfItems,
IList<GeometryObject> geomList, BodyData bodyDataIn,
out BodyGroupKey groupKey, out BodyGroupData groupData, out BodyData bodyData)
{
// Set back to true if all checks are passed.
bool useGroupsIfPossible = false;
groupKey = null;
groupData = null;
bodyData = null;
Group group = element.Group;
if (group != null)
{
ElementId elementId = element.Id;
bool pristineGeometry = true;
foreach (GeometryObject geomObject in geomList)
{
try
{
ICollection<ElementId> generatingElementIds = element.GetGeneratingElementIds(geomObject);
int numGeneratingElements = generatingElementIds.Count;
if ((numGeneratingElements > 1) || (numGeneratingElements == 1 && (generatingElementIds.First() != elementId)))
{
pristineGeometry = false;
break;
}
}
catch
{
pristineGeometry = false;
break;
}
}
if (pristineGeometry)
{
groupKey = new BodyGroupKey();
IList<ElementId> groupMemberIds = group.GetMemberIds();
int numMembers = groupMemberIds.Count;
for (int idx = 0; idx < numMembers; idx++)
{
if (groupMemberIds[idx] == elementId)
{
groupKey.GroupMemberIndex = idx;
break;
}
}
if (groupKey.GroupMemberIndex >= 0)
{
groupKey.GroupTypeId = group.GetTypeId();
groupData = ExporterCacheManager.GroupElementGeometryCache.Find(groupKey);
if (groupData == null)
{
groupData = new BodyGroupData();
useGroupsIfPossible = true;
}
else
{
IList<IFCAnyHandle> groupBodyItems = new List<IFCAnyHandle>();
foreach (IFCAnyHandle mappedRepHnd in groupData.Handles)
{
IFCAnyHandle mappedItemHnd = ExporterUtil.CreateDefaultMappedItem(file, mappedRepHnd);
groupBodyItems.Add(mappedItemHnd);
}
bodyData = new BodyData(bodyDataIn);
bodyData.RepresentationHnd = RepresentationUtil.CreateBodyMappedItemRep(exporterIFC, element, categoryId, contextOfItems, groupBodyItems);
return true;
}
}
}
}
return useGroupsIfPossible;
}