Pagina's op IkLeerBIM

vrijdag 28 februari 2014

Select alle ID's via een Revit HTML Report

Altijd al eens in Revit alle items in een Error Report, een Warning Report of een Clash Report tegelijkertijd willen selecteren? Nou ik wel. Een manier /omweg om dit te doen is via Excel. En anders is het wachten op een goede Addin of aanpassing van Autodesk. Onderstaande mogelijkheid is geen 100% score maar handig genoeg.
Ik wil af en toe alle elementen in deze lijst tegelijk kunnen selecteren.
Voordat we in Excel aan het bouwen slaan: Onderstaande functie werkt goed genoeg. Maar als de lengte / aantal karakters van de Element-ID te veel wisselt - wat ik niet helemaal kan overzien - zal de functie maar gedeeltelijk werken. Ik selecteer namelijk een ID met een vast aantal karakters. In mijn project kwamen er ID’s in de lijst voor met 6 en 7 karakters. Voor de onderstaande formules zou ik dan het beste 7 kunnen gebruiken aangezien de extra spatie niet relevant is. Een andere optie is om de lengte van de ID per stuk vast te stellen. Dit zal de eenvoud van de complexe formule niet ten goede komen al is het niet onmogelijk.


Sla een Report op als HTML. Link dit bestand in Excel. Bij de instellingen van het importeren kan je aangeven dat deze link steeds vernieuwd dient te worden. Op die manier kan je het HTML bestand elke keer weer overschrijven, met een nieuwe versie. Zorg dat je bij het importeren de exacte HTML tekst ziet zonder opmaak. Dit vereenvoudigd het geautomatiseerd zoeken naar de ID’s omdat er maar 1 kolom is.

Ga op een ander tabblad in Excel een mooie formule bouwen. Doe dit in verschillende stappen. En kopieer de formule vervolgens door naar beneden. Op zo'n manier, dat er naar elke regel in de HTML een verwijzing is in de formules op het andere blad.
  1. We beginnen met bouwen in de Cel A2. De formule moet zoeken in de inhoud van cel A2 op het andere blad naar de benaming ": id ". Doe dit met de functie VIND.ALLES. (FIND) In de eerste regel van het Report zal natuurlijk geen ID voorkomen aangezien het een kop is. Maar verderop komen ze wel voor.
  2. Rapporteer de ID op basis van bovenstaand startpunt in de regel. Doe dit met de functie DEEL (MID). De ID is bij mij 6 of 7 karakters lang Dus je kan 7 gebruiken want de eventuele extra spatie is niet relevant. Het startpunt voor de functie is 5 karakters verder dan de waarde gevonden bij punt 1. (": id " = 4 karakters). Als je het nu al moeilijk vind kan je overigens beter afhaken. Want we zijn er nog niet.
  3. Aangezien niet elke regel een ID herbergt is het goed om de foutmeldingen #WAARDE te ondervangen. Dit doe je met de functie ALS.FOUT (IFERROR). Laat de functie de ID rapporteren als die er is. En niks rapporteren als er geen ID is. Dit kan je doen met "".
  4. Voeg de ID’s van alle regels samen, door de inhoud van elke Cel te koppelen met de inhoud van bovenstaande Cel. Dit doe je met de functie TEKST.SAMENVOEGEN (CONCATENATE). Voeg tussen de ID’s een semicolon toe.
  5. Vanzelfsprekend moeten we deze samenvoegingen gaan voorzien van enkele voorwaarden. Als de gevonden ID al in bovenstaande Cel voorkomt, hoeft de ID immers niet meer te worden toegevoegd. Hiervoor gebruiken we een combinatie van bovenstaande functies. De totale formule wordt wat minder overzichtelijk. We gaan nu ook gebruik maken van de functie ALS (IF). Met woorden: Voeg de inhoud van de vorige cel samen met ";" en met het gevonden ID nummer, mits deze niet al voorkomt in bovenstaande Cel.
  6. Als de Cel erboven leeg is, moet er ook niks worden toegevoegd. Dit doen we met de functie ALS (IF). De meest logische plek voor deze voorwaardes is de plek waar uiteindelijk de ID wordt toegevoegd. We gaan dit stuk opzoeken en moeten deze aanpassen. De ALS.FOUT (IFERROR) functie gaan we aanpassen. Want er is geen foutmelding meer als de functie hier eenmaal aankomt. De controle is namenlijk al eerder gebeurt. Er hoeft alleen een semicolon en de ID worden samengevoegd. De semicolon uit punt 5 verplaatst dan naar deze nieuwe plek.
  7. Als we het nog iets netter willen maken, kunnen we zorgen dat de hele tekst niet begint met een semicolon. Hiervoor moeten we de semicolon nog van een voorwaarde voorzien. Namelijk dat wanneer de bovenstaande Cel leeg is, er ook geen semicolon moet worden toegevoegd.
  8. We lijken nu klaar te zijn, maar er zijn nog 2 aandachtspunten.
    Wanneer de HTML veranderd, zijn de verwijzingen stuk. Daarvoor moeten we de directe verwijzingen vervangen door een indirecte verwijzing. De indirecte verwijzing gaan we eerst op een andere plek maken, voordat we deze vervangen op plek van alle directe verwijzingen in de grote formule. We gebruiken de functies ADRES (ADDRESS), RIJ (ROW) en INDIRECT (INDIRECT). ADRES (ADRESS) levert de verwijzing op in de vorm van een tekst. Met RIJ() rapporteren we het rijnummer van de Cel die deze formule bevat. En met INDIRECT kunnen we de inhoud van de indirecte verwijzing inlezen en rapporteren. In dit geval als tekst.
  9. Nu gaan we in de grote formule de directe verwijzingen (Blad1!A2) vervangen voor de indirecte verwijzing INDIRECT(ADRES(RIJ();1;4;1;"Blad1")). De Formule is nu officieel onleesbaar geworden. Maar het gaat goed! We hebben nu alle unieke ID’s te pakken. En de formules zijn bestand tegen het overschrijven van het HTML bestand. Maar we willen ook nog op een eenvoudige manier deze ID’s kunnen selecteren en kopiëren naar Revit. Om dit te kunnen doen moeten we weten hoeveel rijen er in de HTML Report zitten. Je kan dat handmatig doen maar ook dit willen we automatiseren.
  10. Eerst moet de net gemaakte formule omlaag doorgekopieerd worden. het aantal formules moet minstens zo veel zijn als er regels in de HTML zitten. Je kan natuurlijk ook aan de veilige kant gaan zitten.
  11. Wanneer we de kolom A, van het blad waar het HTML bestand op staat, een Naam (Named Range) geven, bijvoorbeeld HTML. Dan kunnen we met behulp van de functie AANTAL.ALS (COUNTIF) de hoeveelheid niet lege cellen tellen. De formule is dan =AANTAL.ALS(HTML; "<>"). Met "<>" geven we aan dat het niet lege cellen zijn.
  12. Dit rijnummer gebruiken we in een indirecte verwijzing naar de Cel waar alle ID’s staan. De formule is dan in mijn geval =INDIRECT(ADRES(AANTAL.ALS(HTML;"<>");1;4;1;"Blad4");1)
  13. Voor de veiligheid kan je een controle maken die de aantal gekopieerde formulecellen vergelijkt met het geïmporteerde HTML bestand. Als er meer regels in het HTML bestand zitten dan gekopieerde formulecellen, kan deze een waarschuwing geven dat niet alle ID’s kunnen worden weergegeven. Dit is eigen verantwoordelijkheid.
Aaah. Eindelijk vruchten van het harde werk. Selecteer de Cel die alle ID’s heeft verzameld. Copy en Paste deze in de Select by ID functie van Revit. (de laatste spaties zijn niet relevant ) Et Voila!


Sommige elementen zullen om verschillende redenen niet zichtbaar / selecteerbaar zijn. Bijvoorbeeld omdat het Sketch lijnen zijn. Ook de 2e ID op een regel zal niet in de lijst verschijnen. Daarvoor moet je alle formules nog een keer bouwen maar dan niet gaan zoeken vanaf het begin maar vanaf (na) de eerste ID. Deze formule is dus een stuk langer.

 

Wat kan je hier nu mee doen?
  • Selecteer alles in een 3D view en gebruik de Isolate Element functie
  • Gebruik het Filter of Add-ins om de selectie specifieker te maken.
    • View specifieke zaken bijvoorbeeld Dimensions kan je een afwijkend Type meegeven ten teken dat ze aangepast moeten worden
  • Geef alle Model categorieën een aangepaste eigenschap (bijvoorbeeld Comments) en gebruik de Filters van de Visibility Graphics om deze elementen op te laten lichten
  • etc.

Als iemand meer weet hoe de ID’s door Revit worden vastgesteld en met name de lengte van de ID houd ik me aanbevolen.

Geen opmerkingen:

Een reactie posten