Skip to content

IfcMappedItem geometry #643

@seghier

Description

@seghier

I have problem with finding how to get IfcMappedItem geometry like beam, door, window, column ...etc

else if (item is IIfcMappedItem mappedItem)
{
    geometryTypes.Add("MappedItem");

    // Add empty entries for the MappedItem itself to keep lists synchronized
    // We add these now because this function MUST add an entry to every list.
    basePlanes.Add(elementPlane);
    startPoints.Add(elementPlane.Origin);
    profileCurves.Add(null);
    extrusionDepths.Add(0);
    extrusionDirections.Add(Vector3d.Zero);
    polylines.Add(null, path); // *** FIX: Added 'path' argument for DataTree
    boundingBoxCorners.Add(Point3d.Origin);
    boundingBoxDimensions.Add(Vector3d.Zero);
    rectangleXDims.Add(0);
    rectangleYDims.Add(0);

    log.Add("Found MappedItem, now investigating its source representation...");

    // --- NEW LOGGING: Check if the source is valid ---
    if (mappedItem.MappingSource == null || mappedItem.MappingSource.MappedRepresentation == null || !mappedItem.MappingSource.MappedRepresentation.Items.Any())
    {
        log.Add("!!! CRITICAL: MappedItem source or its geometry items are null or empty. Cannot create geometry.");
        return; 
    }
    log.Add($"... Source is valid, containing {mappedItem.MappingSource.MappedRepresentation.Items.Count()} items.");

    // Get the mapping transformation
    Transform mappingTransform = Transform.Identity;
    if (mappedItem.MappingTarget is IIfcCartesianTransformationOperator3D transform3D)
    {
        mappingTransform = ConvertCartesianTransformation3D(transform3D, scale);
        log.Add($"... Calculated 3D mapping transform. IsIdentity: {mappingTransform.IsIdentity}");
    }
    else if (mappedItem.MappingTarget is IIfcCartesianTransformationOperator2D transform2D)
    {
        mappingTransform = ConvertCartesianTransformation2D(transform2D, scale);
        log.Add($"... Calculated 2D mapping transform. IsIdentity: {mappingTransform.IsIdentity}");
    }

    // Store the original collections' counts to apply transformation to newly added items
    int originalProfileCount = profileCurves.Count;
    int originalPolylineBranches = polylines.BranchCount; // Corrected to BranchCount

    // Process the source geometry that is being instanced
    foreach (var mappedItemRep in mappedItem.MappingSource.MappedRepresentation.Items)
    {
        // --- NEW LOGGING: What is the type of the source geometry? ---
        log.Add($"  -> Processing source item of type: {mappedItemRep.GetType().Name}");
        ExtractGeometryData((IIfcGeometricRepresentationItem)mappedItemRep, scale, element, path,
            log, elementIds, geometryTypes, profileCurves, extrusionDepths,
            extrusionDirections, basePlanes, startPoints, polylines,
            boundingBoxCorners, boundingBoxDimensions, rectangleXDims, rectangleYDims);
    }

    // --- NEW LOGGING: Check if any geometry was actually created ---
    int newProfiles = profileCurves.Count - originalProfileCount;
    int newPolylineBranches = polylines.BranchCount - originalPolylineBranches;
    log.Add($"... Finished processing source. Found {newProfiles} new profiles and {newPolylineBranches} new polyline branches.");

    // Apply mapping transformation to newly added geometry if any was created
    if (newProfiles > 0 || newPolylineBranches > 0)
    {
        ApplyTransformationToNewGeometry(mappingTransform, originalProfileCount, originalPolylineBranches,
            profileCurves, polylines, basePlanes, startPoints, boundingBoxCorners);
        log.Add("... Successfully applied mapping transformation to new geometry.");
    }
    else
    {
        log.Add("... No new geometry was created from the source, so no transformation was applied.");
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions