I didn't use an event handler. I was considering using Parallel.foreach for each draftingview iterated element id, I don't know if that's possible. Here is themethod with this involved:
private ViewSheet PlaceDraftingViewOnSheet(Document currentDoc, List<ViewDrafting> importedSelectedDraftingViews, EfficientSelectDraftingViewFormFinalMultipleATTEMPT viewForm, ViewSheet importedSelectedSheet)
{
ICollection<Element> draftingViewElements = null;
// Check if the required parameters are null
if (currentDoc == null || importedSelectedDraftingViews == null || viewForm == null || importedSelectedSheet == null)
{
TaskDialog.Show("Error", "One or more required parameters is null(twelve)");
return null;
}
if (!(importedSelectedDraftingViews is List<ViewDrafting>))
{
TaskDialog.Show("Error", "The selected view is not a drafting view");
return null;
}
//Check if selectedDraftingViews contains any elements
foreach (ViewDrafting viewD in importedSelectedDraftingViews)
{
FilteredElementCollector collector = new FilteredElementCollector(viewD.Document, viewD.Id);
draftingViewElements = collector//ICollection<Element>
.WhereElementIsNotElementType()
.ToElements();
if (draftingViewElements.Count == 0 || draftingViewElements == null)
{
TaskDialog.Show("Info", "The selected drafting view does not contain any elements.");
return null;
}
//Loop through each element in each draftingView.
foreach (Element element in draftingViewElements)
{
if (element == null)
{
//if (importedSelectedSheet == null || selectedDraftingViews == null || draftingViewElements == null)
//{
TaskDialog.Show("Error", $"Selected sheet '{importedSelectedSheet.Name}' not found(thirteen)");
return null;
//}
}
}
}
try
{
double offsetX = 0.0;//Initial X Offset
double offsetY = 0.0;// Y Offset
foreach (ViewDrafting importedSelectedDraftingView in importedSelectedDraftingViews)
{
if (importedSelectedDraftingView != null && externalDoc != null && currentDoc != null)
{
//ICollection<ElementId> CopiedElements = ElementTransformUtils.CopyElements(externalDoc, new List<ElementId> { selectedDraftingView.Id }, currentDoc, null, null);
// Copy the drafting view to the current document
ElementId copiedViewElementId = ElementTransformUtils.CopyElements(externalDoc, new List<ElementId> { importedSelectedDraftingView.Id }, currentDoc, null, null).FirstOrDefault();
if (copiedViewElementId == null || copiedViewElementId == ElementId.InvalidElementId)
{
TaskDialog.Show("Error", "Failed to copy the drafting view to the sheet");
return null;
}
// Store the copied view element ID for later use
copiedViewElementIds.Add(copiedViewElementId);
View copyView = currentDoc.GetElement(copiedViewElementId) as View;
// Validate the sheet and drafting view dimensions
if (importedSelectedSheet != null && importedSelectedDraftingView != null)
{
if (!ValidateSheetAndDraftingView(importedSelectedSheet, importedSelectedDraftingView))
{
return null; // Validation failed
}
}
IEnumerable<ElementId> vft = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.Where(e =>
(e.Category != null && !(e is View)))
.Select(e => e.Id);
IEnumerable<ElementId> draftViewsInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfClass(typeof(ViewDrafting))
.Select(e => e.Id);
IEnumerable<ElementId> detailLinesInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
//.OfClass(typeof(DetailLine))
.OfClass(typeof(CurveElement))
//.Where(e => e is DetailLine)
.Select(e => e.Id);
IEnumerable<ElementId> familyInstancesInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfClass(typeof(FamilyInstance))
.WhereElementIsNotElementType()
.Cast<FamilyInstance>()
.Where(fi => fi.Category.Name == "Views")
.Select(fi => fi.Id);
//.OfCategory(BuiltInCategory.OST_TextNotes)
//.OfCategory(BuiltInCategory.OST_GenericAnnotation)
//.Union(new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id).OfCategory(BuiltInCategory.OST_Dimensions))
//.Union(new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id).OfCategory(BuiltInCategory.OST_GenericAnnotation))
//.Select(e => e.Id);
//.ToList();
//Filtered Element collector for detail components within the specified view
IEnumerable<ElementId> detailComponentsInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfCategory(BuiltInCategory.OST_DetailComponents)
.Where(e => (e is Autodesk.Revit.DB.Group))
.Select(e => e.Id);
//.ToList();
//Filtered Element collector for sketch elements within the specified view
IEnumerable<ElementId> sketchElementsInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfClass(typeof(CurveElement))
//.Where(e => e is Sketch || e is ModelCurve || e is DetailCurve || e is FilledRegion)
.Select(e => e.Id);
//.ToList();
//Filtered Element Collector for view filters within the specified view
IEnumerable<ElementId> viewFiltersInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfClass(typeof(ParameterFilterElement))
.Select(e => e.Id);
//.ToList();
//Filtered Element Collector for imported CAD files within the specified view
IEnumerable<ElementId> importedCADFilesInView = new FilteredElementCollector(externalDoc, importedSelectedDraftingView.Id)
.OfClass(typeof(ImportInstance))
.Select(e => e.Id);
//.ToList();
List<ElementId> nonExportableElementsInView = importedCADFilesInView.ToList();
//--------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------
vft = vft.Except(nonExportableElementsInView);
//Test print all elements by name and Id(KEEP CODE)
// Check if all elements were successfully copied
if (copiedViewElementIds.Count < vft.Count())
{
//TaskDialog.Show("Error", "Some elements could not be copied:");
}
//Version Efficient-OLD
//foreach (ElementId elementId in vft)
//{
// if (!copiedViewElementIds.Contains(elementId))
// {
// Element elementToCopy = externalDoc.GetElement(elementId);
// if (elementToCopy != null &&
// //!IsAnnotationComponent(elementToCopy) &&
// //!IsDetailComponent(elementToCopy) &&
// //!IsTemporaryOrAuxiliaryGeometry(elementToCopy) &&
// !IsView(elementToCopy) &&
// //!IsLine(elementToCopy) &&
// //!IsDimension(elementToCopy) &&
// !IsRevitDBCategory(elementToCopy) &&
// !IsCategoryNameViews(elementToCopy))
// {
// try
// {
// if (IsDetailGroup(elementToCopy))
// {
// // If the element is a detail group, extract its elements and copy them individually
// Group detailGroup = elementToCopy as Group;
// ICollection<ElementId> groupMemberIds = detailGroup.GetMemberIds();
// foreach (ElementId memberId in groupMemberIds)
// {
// Element memberToCopy = externalDoc.GetElement(memberId);
// if (memberToCopy != null)
// //!IsAnnotationComponent(memberToCopy) &&
// //!IsDetailComponent(memberToCopy) &&
// //!IsTemporaryOrAuxiliaryGeometry(memberToCopy) &&
// //!IsView(memberToCopy) &&
// //!IsLine(memberToCopy) &&
// //!IsDimension(memberToCopy) &&
// //!IsRevitDBCategory(memberToCopy) &&
// //!IsCategoryNameViews(memberToCopy))
// {
// // Copy the individual member
// //ElementTransformUtils.CopyElements(importedSelectedDraftingView, new List<ElementId> { memberId }, copyView, Transform.Identity, null);
// //
// CopyElementsWithDuplicateTypeHandling(externalDoc, importedSelectedDraftingView, new List<ElementId> { memberId }, copyView);
// // If the copy operation succeeds, add the element to the list of copied elements
// copiedViewElementIds.Add(memberId);
// }
// }
// }
// else
// {
// // If the element is not a detail group, copy it as usual
// //ElementTransformUtils.CopyElements(importedSelectedDraftingView, new List<ElementId> {elementId} , copyView, Transform.Identity, null);
// CopyElementsWithDuplicateTypeHandling(externalDoc, importedSelectedDraftingView, new List<ElementId> { elementId }, copyView);
// // If the copy operation succeeds, add the element to the list of copied elements
// copiedViewElementIds.Add(elementId);
// }
// }
// catch (Exception ex)
// {
// // Construct the error message
// string errorMessage = $"Failed to copy Element: {ex.Message} - Element Name: {elementToCopy.Name}, Category: {elementToCopy.Category?.Name ?? "Uncategorized"}, ID: {elementToCopy.Id.IntegerValue}";
// // Display the error message
// TaskDialog.Show("Error", errorMessage);
// }
// }
// }
//}
HashSet<ElementId> copiedElementIdsSet = new HashSet<ElementId>(copiedViewElementIds);
var elementsToCopy = vft.Except(copiedElementIdsSet)
.Select(elementId => externalDoc.GetElement(elementId))
.Where(elementToCopy =>
elementToCopy != null &&
!IsView(elementToCopy) &&
!IsRevitDBCategory(elementToCopy) &&
!IsCategoryNameViews(elementToCopy));
foreach (Element elementToCopy in elementsToCopy)
{
if (IsDetailGroup(elementToCopy))
{
Autodesk.Revit.DB.Group detailGroup = elementToCopy as Autodesk.Revit.DB.
Group;
ICollection<ElementId> groupMemberIds = detailGroup.GetMemberIds();
foreach (ElementId memberId in groupMemberIds)
{
Element memberToCopy = externalDoc.GetElement(memberId);
if (memberToCopy != null &&
!IsView(memberToCopy) &&
!IsRevitDBCategory(memberToCopy) &&
!IsCategoryNameViews(memberToCopy))
{
CopyElementsWithDuplicateTypeHandling(externalDoc, importedSelectedDraftingView, new List<ElementId> { memberId }, copyView);
copiedElementIdsSet.Add(memberId);
}
}
}
else
{
CopyElementsWithDuplicateTypeHandling(externalDoc, importedSelectedDraftingView, new List<ElementId> { elementToCopy.Id }, copyView);
copiedElementIdsSet.Add(elementToCopy.Id);
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Get the copied drafting view element
if (copyView != null && copyView is View copiedView)
{
//XYZ sheetCenter = CalculateSheetCenter(newSheet);
XYZ sheetCenter = CalculateSheetCenter(importedSelectedSheet);
//TaskDialog.Show("Print", $"importedSelectedSheet variable{importedSelectedSheet}");
//XYZ viewportPosition = new XYZ(sheetCenter.X + offsetX, sheetCenter.Y + offsetY, sheetCenter.Z);
//Viewport viewport = Viewport.Create(currentDoc, newSheet.Id, copiedView.Id, sheetCenter);
Viewport viewport = Viewport.Create(currentDoc, importedSelectedSheet.Id, copiedView.Id, sheetCenter);
currentDoc.Regenerate();
if (viewport == null)
{
TaskDialog.Show("Error", "Failed to create viewport for the drafting view in the sheet(fourteen) !");
return null;
}
offsetX += 100.0;
offsetY += 0.0;
}
else
{
TaskDialog.Show("Error", "Error past the try before returning selected Sheet");
return null;
}
}
else
{
TaskDialog.Show("Print", "Selected Drafting View is null");
}
}
return importedSelectedSheet;
}
catch (Exception ex)
{
TaskDialog.Show("Error", $"An error occurred(seventeen): {ex.Message}");
return null;
}
}
private void HideDupeMessages(object sender, FailuresProcessingEventArgs e)
{
FailuresAccessor FA = e.GetFailuresAccessor();
foreach (FailureMessageAccessor fmsg in FA.GetFailureMessages())
{
if (fmsg.GetSeverity() == FailureSeverity.Warning && IsDuplicateTypeMessage(fmsg))
{
// Always delete the warning and proceed with the operation
FA.DeleteWarning(fmsg);
e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
}
}
// Continue with the operation for other failure messages
//e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
e.SetProcessingResult(FailureProcessingResult.Continue);
}