Grazie al feedback di un lettore ho potuto sistemare un paio di inconsistenze nel codice sin qui sviluppato:
Quando sono presenti sia linee di dettaglio sia linee di modello la macro dava un messaggio di errore, è bastato aggiungere un filtro per gli elementi curva specificando che il tipo di oggetto che interessa per far funzionare la macro sono solo le linee di dettaglio:
CurveElementFilter detline =new CurveElementFilter(CurveElementType.DetailCurve,false);
Successivamente quando si va a comporre la lista delle linee di dettaglio da eliminare si deve aggiungere questa condizione di filtro, pertanto il blocco relativo diventa:
IList OldLines = new FilteredElementCollector(doc).
OfCategory(BuiltInCategory.OST_Lines).
WherePasses(detline).
Cast().
Where(x=> x.LineStyle.Name.StartsWith("Fire Rating - ")
&&
x.OwnerViewId.IntegerValue==doc.ActiveView.Id.IntegerValue)
.ToList();
La seconda revisione invece riguarda i muri creati da superficie (come le masse), perché non hanno la proprietà di LocationCurve che serve per creare la linea di dettaglio e ricavare poi il posizionamento delle etichette.
Per il momento questo tipo di muri vengono esclusi dalla macro, ho quindi inserito un blocco try/catch che verifica appunto se il muro è da tracciamento oppure no:
foreach (Reference r in Walls)
{
Wall e = doc.GetElement(r) as Wall;
try {
lc = e.Location as LocationCurve;
} catch (Exception) {
continue;
}
......
Qui il
codice aggiornato.
If you're happy with my code, please Pay What You Want via PayPal to:
puntorevit@gmail.com