1,2,3, Search!

An intermediate Revit user should be able to work with this add-in with little to none extra effort to figure out what is what, and many of the concepts below are pretty self-explanatory. There are also some tutorial videos that’s much intuitive to follow than pure texts.

However, there are always times when you are in double of what you are seeing in front of you, and these texts may help shedding some light. If you still have question, or some brilliant suggestion for improvement, feel free to reach out and I will be very happy to help.

The Idea

Browsing through Revit Ideas forum, it is amazing to find that so many great ideas, or very often, complains, are all pointing to the same big issue: access and control of data. People are asking questions like why we cannot get the same amount of data, if not even more, into schedules as what’s showing on UI. Myself as both a user and an add-in developer, understands the needs and dilemmas of both sides. While Autodesk is constantly improving their product (this Revit Idea forum is a great idea by itself, and I can see that Autodesk is seriously improving Revit by adding what the users are asking for), it cannot possibly address every single demand from the users. That’s the reason we have Dynamo and Revit API, with which we can programmatically access model data and create specialized workflows that solves our individual problems. While Dynamo is a powerful tool, it’s interface and workflow requires learning and adaptation, making it hard to truly become part of daily routine for most users. Also, there are still lots of functions that are available in Revit API, but not yet in Dynamo. Therefore, if we want one simple tool that covers the basic needs of data access and control, Revit API is still the best place to go.

So here we are, we have this add-in called “123 Search” that set out to address this very problem with a simplistic approach of design. The goal is to allow us to get maximum flexibility in terms of ways to access and control data, with a relatively flat learning curve, and as few “clicks” as possible.

Basic Workflow

It is called 123 Search because “search” is the starting point of any data control, and quite often, a nicely filtered search is all we need. The add-in allows us to search the model database in various ways, show these data, and get them ready for further interaction.

Element vs Object

There are lots of “things” in a model, and we all know that the things we can put on a schedule are only a small part of all the things in a model. We can label them “schedulable” or “non-schedulable” if we want. Similarly, we can (roughly) put all the things into two groups decided by whether they are searchable using Revit API. Those that are searchable are called “elements”, and all the rests I would just call them “objects”. The good news is, elements contains all the schedulable things, as well as many others, such as texts, dimensions, detail items, etc. So that’s a good start of full access to data BUT (there is always one), those non-searchable objects also contains valuable data. We will know some of those objects soon when we look at how to get those data.

Data Path

We all know that objects in a BIM model are inter-connected, and if we try to visualize a model, it will be more like a network with nodes and connections. If we want to get to some data out there in the model, we need to start from searchable 3D and 2D elements, and travel along a “path” with one or more “nodes”. For example, if we want to get the material of each layer inside a wall, we know how to do it in Revit UI: select one of the wall, get its wall type, then get its “structure” which contains all the layers, then finally we get the material for each layer. There is a similar, but not exactly the same “path” to get the same data use this add-in. I call it “data path”, it works like a set of navigation instructions. Once a path is established, it can be used on other elements, and retrieve the same type of data. The layer material is an example of a path with multiple “nodes”, at each node there is an instruction pointing to the next node, in that example the nodes are: wall -> wall type -> structure -> layer -> material. Very often what we need is only one node, which points from the element to one of its parameters.

Object Feature

Every Revit element has its parameters, which we are all familiar with in Revit UI. With Revit API, we can usually access the same or more data than Revit UI. In Revit API, each element has parameters, as well as “Methods” and “Properties” (these two words are programming terms). These methods and properties sometimes gives us data that’s not available from one of the parameters. I dubbed the word “feature” for all three: parameters, methods and properties, because they serve the same purpose when we navigate data out of the model. Those non-searchable objects also have their own features, and that’s how we get to the material information in the wall layers example.

Search Setup

We can setup our search in various ways, and save it for later use. One thing that worth noting in search setup is the difference between “category” and “class”. These are two ways to put elements in groups. Category is the way we are seeing on Revit UI: elements are put into groups like walls and windows, and Revit uses these same categories when setting up parameters and schedules. On the other hand, the concept of class is essential within the world of computer programs, and here it serves another way to start our search with defined groups of elements. Very often a category can find its counterpart class, e.g. category “walls” and class “wall”, and they point to the same group of elements. There are also cases when these two does not match. Depends on what we need to achieve, one way might be better than the other, we will need to try before we know.

Search Result

Once finish setup and click “search”, the add-in will search for all elements inside model that meets all the criteria, and display all the feature values in a table view. Each row of this table is one element, and each cell of that row is one feature of that element. We can “explore” and get inside a feature value if that value is not just basic values like texts and numbers, and create data path to get the data we are after. Once we have our new data path ready, we hit “search” again, and each data path will create a new column that contains the data it brings, just like other object features. Refer to the tutorial video, since it is a much better way to demonstrate.

Interaction

With all the features and data paths available, we can go to “interaction” tab, and the add-in will take a look at each of them, decide in which ways we could change its value. In this schedule-alike interface, we can batch-assign new values, or utilize the might of Excel spreadsheet to populate value the way we want. Note that for now, model interaction only supports changing values of parameters, not methods and properties.

Specialty Function Packages

The search and interaction function serves as the base interface for all other specialty function packages, such as “spell check” and “power key schedule”. These specialized packages are intended for those items that’s high on users’ wish-list. I am eager to hear your saying of what should be the next package, and we can work together to make this tool better.

Advertisements

List of Revit Element Categories

Element Category List for Model Snapshot

BuiltInCategory.OST_PointClouds,
BuiltInCategory.OST_Sun,
BuiltInCategory.OST_SunPath1,
BuiltInCategory.OST_SunPath2,
BuiltInCategory.OST_SunStudy,
BuiltInCategory.OST_Truss,
BuiltInCategory.OST_Cage,
BuiltInCategory.OST_PathRein,
BuiltInCategory.OST_AreaRein,
BuiltInCategory.OST_Rebar,
BuiltInCategory.OST_PlaceHolderDucts,
BuiltInCategory.OST_PlaceHolderPipes,
BuiltInCategory.OST_ElectricalCircuit,
BuiltInCategory.OST_ElectricalInternalCircuits,
BuiltInCategory.OST_CableTray,
BuiltInCategory.OST_CableTray,
BuiltInCategory.OST_Conduit,
BuiltInCategory.OST_Wire,
BuiltInCategory.OST_DuctSystem,
BuiltInCategory.OST_DesignOptions,
BuiltInCategory.OST_DesignOptionSets,
BuiltInCategory.OST_Revisions,
BuiltInCategory.OST_RevisionClouds,
BuiltInCategory.OST_DecalElement,
BuiltInCategory.OST_DecalType,
BuiltInCategory.OST_LoadCases,
BuiltInCategory.OST_InternalAreaLoads,
BuiltInCategory.OST_InternalLineLoads,
BuiltInCategory.OST_InternalPointLoads,
BuiltInCategory.OST_InternalLoads,
BuiltInCategory.OST_AreaLoads,
BuiltInCategory.OST_LineLoads,
BuiltInCategory.OST_PointLoads,
BuiltInCategory.OST_Loads,
BuiltInCategory.OST_MEPSpaces,
BuiltInCategory.OST_Mass,
BuiltInCategory.OST_Areas,
BuiltInCategory.OST_ProjectInformation,
BuiltInCategory.OST_Sheets,
BuiltInCategory.OST_Entourage,
BuiltInCategory.OST_Planting,
BuiltInCategory.OST_RvtLinks,
BuiltInCategory.OST_SpecialityEquipment,
BuiltInCategory.OST_Topography,
BuiltInCategory.OST_StructuralTruss,
BuiltInCategory.OST_StructuralColumns,
BuiltInCategory.OST_Purlin,
BuiltInCategory.OST_Joist,
BuiltInCategory.OST_Girder,
BuiltInCategory.OST_StructuralFraming,
BuiltInCategory.OST_BuildingPad,
BuiltInCategory.OST_Site,
BuiltInCategory.OST_Sewer,
BuiltInCategory.OST_Roads,
BuiltInCategory.OST_Property,
BuiltInCategory.OST_Parking,
BuiltInCategory.OST_PlumbingFixtures,
BuiltInCategory.OST_MechanicalEquipment,
BuiltInCategory.OST_LightingFixtures,
BuiltInCategory.OST_FurnitureSystems,
BuiltInCategory.OST_ElectricalFixtures,
BuiltInCategory.OST_ElectricalEquipment,
BuiltInCategory.OST_Casework,
BuiltInCategory.OST_RailingSystem,
BuiltInCategory.OST_Materials,
BuiltInCategory.OST_RasterImages,
BuiltInCategory.OST_Elev,
BuiltInCategory.OST_Lights,
BuiltInCategory.OST_Viewports,
BuiltInCategory.OST_Cameras,
BuiltInCategory.OST_CurtaSystem,
BuiltInCategory.OST_TitleBlocks,
BuiltInCategory.OST_Views,
BuiltInCategory.OST_Parts,
BuiltInCategory.OST_Assemblies,
BuiltInCategory.OST_Levels,
BuiltInCategory.OST_Grids,
BuiltInCategory.OST_Sections,
BuiltInCategory.OST_Massing,
BuiltInCategory.OST_Ramps,
BuiltInCategory.OST_Railings,
BuiltInCategory.OST_StairsRailing,
BuiltInCategory.OST_Rooms,
BuiltInCategory.OST_GenericModel,
BuiltInCategory.OST_Fixtures,
BuiltInCategory.OST_Stairs,
BuiltInCategory.OST_Phases,
BuiltInCategory.OST_Columns,
BuiltInCategory.OST_Furniture,
BuiltInCategory.OST_Ceilings,
BuiltInCategory.OST_Roofs,
BuiltInCategory.OST_Floors,
BuiltInCategory.OST_Doors,
BuiltInCategory.OST_Windows,
BuiltInCategory.OST_Walls,
BuiltInCategory.OST_ScheduleGraphics,

All Available Revit Element Categories

OST_StackedWalls_Obsolete_IdInWrongRange
OST_MassTags_Obsolete_IdInWrongRange
OST_MassSurface_Obsolete_IdInWrongRange
OST_MassFloor_Obsolete_IdInWrongRange
OST_Mass_Obsolete_IdInWrongRange
OST_WallRefPlanes_Obsolete_IdInWrongRange
OST_StickSymbols_Obsolete_IdInWrongRange
OST_RemovedGridSeg_Obsolete_IdInWrongRange
OST_PointClouds
OST_AssemblyOrigin_Lines
OST_AssemblyOrigin_Planes
OST_AssemblyOrigin_Points
OST_AssemblyOrigin
OST_LinksAnalytical
OST_FoundationSlabAnalyticalTags
OST_WallFoundationAnalyticalTags
OST_IsolatedFoundationAnalyticalTags
OST_WallAnalyticalTags
OST_FloorAnalyticalTags
OST_ColumnAnalyticalTags
OST_BraceAnalyticalTags
OST_BeamAnalyticalTags
OST_AnalyticalNodes_Lines
OST_AnalyticalNodes_Planes
OST_AnalyticalNodes_Points
OST_AnalyticalNodes
OST_RigidLinksAnalytical
OST_FoundationSlabAnalytical
OST_WallFoundationAnalytical
OST_IsolatedFoundationAnalytical
OST_WallAnalytical
OST_FloorAnalytical
OST_ColumnEndSegment
OST_ColumnStartSegment
OST_ColumnAnalytical
OST_BraceEndSegment
OST_BraceStartSegment
OST_BraceAnalytical
OST_BeamEndSegment
OST_BeamStartSegment
OST_BeamAnalytical
OST_CompassSecondaryMonth
OST_CompassPrimaryMonth
OST_CompassSectionFilled
OST_LightLine
OST_MultiSurface
OST_SunSurface
OST_Analemma
OST_SunsetText
OST_CompassSection
OST_CompassOuter
OST_SunriseText
OST_CompassInner
OST_SunPath2
OST_SunPath1
OST_Sun
OST_SunStudy
OST_StructuralTrussStickSymbols
OST_StructuralTrussHiddenLines
OST_TrussChord
OST_TrussWeb
OST_TrussBottomChordCurve
OST_TrussTopChordCurve
OST_TrussVertWebCurve
OST_TrussDiagWebCurve
OST_Truss
OST_RailingSystemTransitionHiddenLines_Deprecated
OST_RailingSystemTerminationHiddenLines_Deprecated
OST_RailingSystemRailHiddenLines_Deprecated
OST_RailingSystemTopRailHiddenLines_Deprecated
OST_RailingSystemHandRailBracketHiddenLines_Deprecated
OST_RailingSystemHandRailHiddenLines_Deprecated
OST_RailingSystemPanelBracketHiddenLines_Deprecated
OST_RailingSystemPanelHiddenLines_Deprecated
OST_RailingSystemBalusterHiddenLines_Deprecated
OST_RailingSystemPostHiddenLines_Deprecated
OST_RailingSystemSegmentHiddenLines_Deprecated
OST_RailingSystemHiddenLines_Deprecated
OST_StairStringer2012HiddenLines_Deprecated
OST_StairTread2012HiddenLines_Deprecated
OST_StairLanding2012HiddenLines_Deprecated
OST_StairRun2012HiddenLines_Deprecated
OST_Stairs2012HiddenLines_Deprecated
OST_MassHiddenLines
OST_CurtaSystemHiddenLines
OST_OBSOLETE_ElemArrayHiddenLines
OST_EntourageHiddenLines
OST_PlantingHiddenLines
OST_SpecialityEquipmentHiddenLines
OST_TopographyHiddenLines
OST_StructuralFramingSystemHiddenLines_Obsolete
OST_SiteHiddenLines
OST_RoadsHiddenLines
OST_ParkingHiddenLines
OST_PlumbingFixturesHiddenLines
OST_MechanicalEquipmentHiddenLines
OST_LightingFixturesHiddenLines
OST_FurnitureSystemsHiddenLines
OST_ElectricalFixturesHiddenLines
OST_ElectricalEquipmentHiddenLines
OST_CaseworkHiddenLines
OST_DetailComponentsHiddenLines
OST_ShaftOpeningHiddenLines
OST_GenericModelHiddenLines
OST_CurtainWallMullionsHiddenLines
OST_CurtainWallPanelsHiddenLines
OST_RampsHiddenLines
OST_StairsRailingHiddenLines
OST_StairsHiddenLines
OST_ColumnsHiddenLines
OST_FurnitureHiddenLines
OST_LinesHiddenLines
OST_CeilingsHiddenLines
OST_RoofsHiddenLines
OST_DoorsHiddenLines
OST_WindowsHiddenLines
OST_StructConnectionProfilesTags
OST_StructConnectionHoleTags
OST_CouplerHiddenLines
OST_CouplerTags
OST_Coupler
OST_StructConnectionWeldTags
OST_StructConnectionShearStudTags
OST_StructConnectionAnchorTags
OST_StructConnectionBoltTags
OST_StructConnectionPlateTags
OST_RebarHiddenLines
OST_StructSubConnections
OST_StructConnectionModifiers
OST_StructConnectionWelds
OST_StructConnectionHoles
OST_StructConnectionShearStuds
OST_StructConnectionNobleWarning
OST_StructConnectionOthers
OST_StructConnectionBolts
OST_StructConnectionTags
OST_StructConnectionAnchors
OST_StructConnectionPlates
OST_StructConnectionProfiles
OST_StructConnectionReference
OST_StructConnectionFailed
OST_StructConnectionStale
OST_StructConnectionSymbol
OST_StructConnectionHiddenLines
OST_StructWeldLines
OST_StructConnections
OST_FabricAreaBoundary
OST_FabricReinSpanSymbol
OST_FabricReinforcementWire
OST_FabricReinforcementBoundary
OST_RebarSetToggle
OST_FabricAreaTags
OST_FabricReinforcementTags
OST_AreaReinTags
OST_RebarTags
OST_FabricAreaSketchSheetsLines
OST_FabricAreaSketchEnvelopeLines
OST_FabricAreas
OST_FabricReinforcement
OST_RebarCover
OST_CoverType
OST_RebarShape
OST_PathReinBoundary
OST_PathReinTags
OST_PathReinSpanSymbol
OST_PathRein
OST_Cage
OST_AreaReinXVisibility
OST_AreaReinBoundary
OST_AreaReinSpanSymbol
OST_AreaReinSketchOverride
OST_AreaRein
OST_RebarLines
OST_RebarSketchLines
OST_Rebar
OST_FabricationPipeworkInsulation
OST_FabricationDuctworkLining
OST_FabricationContainmentDrop
OST_FabricationContainmentRise
OST_FabricationPipeworkDrop
OST_FabricationPipeworkRise
OST_FabricationContainmentSymbology
OST_FabricationContainmentCenterLine
OST_FabricationContainmentTags
OST_FabricationContainment
OST_FabricationPipeworkSymbology
OST_FabricationPipeworkCenterLine
OST_FabricationPipeworkTags
OST_FabricationPipework
OST_FabricationDuctworkSymbology
OST_FabricationDuctworkDrop
OST_FabricationDuctworkRise
OST_FabricationHangerTags
OST_FabricationHangers
OST_OBSOLETE_FabricationPartsTmpGraphicDropDrag
OST_FabricationPartsTmpGraphicDrag
OST_OBSOLETE_FabricationPartsTmpGraphicDrop
OST_FabricationPartsTmpGraphicEnd
OST_FabricationDuctworkInsulation
OST_LayoutNodes
OST_FabricationDuctworkCenterLine
OST_FabricationServiceElements
OST_FabricationDuctworkTags
OST_FabricationDuctwork
OST_LayoutPathBase_Pipings
OST_NumberingSchemas
OST_DivisionRules
OST_gbXML_Shade
OST_AnalyticSurfaces
OST_AnalyticSpaces
OST_gbXML_OpeningAir
OST_gbXML_NonSlidingDoor
OST_gbXML_SlidingDoor
OST_gbXML_OperableSkylight
OST_gbXML_FixedSkylight
OST_gbXML_OperableWindow
OST_gbXML_FixedWindow
OST_gbXML_UndergroundCeiling
OST_gbXML_UndergroundSlab
OST_gbXML_UndergroundWall
OST_gbXML_SurfaceAir
OST_gbXML_Ceiling
OST_gbXML_InteriorFloor
OST_gbXML_InteriorWall
OST_gbXML_SlabOnGrade
OST_gbXML_RaisedFloor
OST_gbXML_Roof
OST_gbXML_ExteriorWall
OST_DivisionProfile
OST_SplitterProfile
OST_PipeSegments
OST_GraphicalWarning_OpenConnector
OST_PlaceHolderPipes
OST_PlaceHolderDucts
OST_PipingSystem_Reference_Visibility
OST_PipingSystem_Reference
OST_DuctSystem_Reference_Visibility
OST_DuctSystem_Reference
OST_PipeInsulationsTags
OST_DuctLiningsTags
OST_DuctInsulationsTags
OST_ElectricalInternalCircuits
OST_PanelScheduleGraphics
OST_CableTrayRun
OST_ConduitRun
OST_ParamElemElectricalLoadClassification
OST_DataPanelScheduleTemplates
OST_SwitchboardScheduleTemplates
OST_BranchPanelScheduleTemplates
OST_ConduitStandards
OST_ElectricalLoadClassifications
OST_ElectricalDemandFactorDefinitions
OST_ConduitFittingCenterLine
OST_CableTrayFittingCenterLine
OST_ConduitCenterLine
OST_ConduitDrop
OST_ConduitRiseDrop
OST_CableTrayCenterLine
OST_CableTrayDrop
OST_CableTrayRiseDrop
OST_ConduitTags
OST_Conduit
OST_CableTrayTags
OST_CableTray
OST_ConduitFittingTags
OST_ConduitFitting
OST_CableTrayFittingTags
OST_CableTrayFitting
OST_RoutingPreferences
OST_DuctLinings
OST_DuctInsulations
OST_PipeInsulations
OST_HVAC_Load_Schedules
OST_HVAC_Load_Building_Types
OST_HVAC_Load_Space_Types
OST_HVAC_Zones_Reference_Visibility
OST_HVAC_Zones_InteriorFill_Visibility
OST_HVAC_Zones_ColorFill
OST_ZoneTags
OST_LayoutPath_Bases
OST_WireTemperatureRatings
OST_WireInsulations
OST_WireMaterials
OST_HVAC_Zones_Reference
OST_HVAC_Zones_InteriorFill
OST_HVAC_Zones_Boundary
OST_HVAC_Zones
OST_Fluids
OST_PipeSchedules
OST_PipeMaterials
OST_PipeConnections
OST_EAConstructions
OST_SwitchSystem
OST_SprinklerTags
OST_Sprinklers
OST_RouteCurveBranch
OST_RouteCurveMain
OST_RouteCurve
OST_GbXML_Opening
OST_GbXML_SType_Underground
OST_GbXML_SType_Shade
OST_GbXML_SType_Exterior
OST_GbXML_SType_Interior
OST_GbXMLFaces
OST_WireHomeRunArrows
OST_LightingDeviceTags
OST_LightingDevices
OST_FireAlarmDeviceTags
OST_FireAlarmDevices
OST_DataDeviceTags
OST_DataDevices
OST_CommunicationDeviceTags
OST_CommunicationDevices
OST_SecurityDeviceTags
OST_SecurityDevices
OST_NurseCallDeviceTags
OST_NurseCallDevices
OST_TelephoneDeviceTags
OST_TelephoneDevices
OST_WireTickMarks
OST_PipeFittingInsulation
OST_PipeFittingCenterLine
OST_FlexPipeCurvesInsulation
OST_PipeCurvesInsulation
OST_PipeCurvesDrop
OST_DuctFittingLining
OST_DuctFittingInsulation
OST_DuctFittingCenterLine
OST_FlexDuctCurvesInsulation
OST_DuctCurvesLining
OST_DuctCurvesInsulation
OST_DuctCurvesDrop
OST_DuctFittingTags
OST_PipeFittingTags
OST_PipeColorFills
OST_PipeColorFillLegends
OST_WireTags
OST_PipeAccessoryTags
OST_PipeAccessory
OST_PipeCurvesRiseDrop
OST_FlexPipeCurvesPattern
OST_FlexPipeCurvesContour
OST_FlexPipeCurvesCenterLine
OST_FlexPipeCurves
OST_PipeFitting
OST_FlexPipeTags
OST_PipeTags
OST_PipeCurvesContour
OST_PipeCurvesCenterLine
OST_PipeCurves
OST_PipingSystem
OST_ElectricalDemandFactor
OST_ElecDistributionSys
OST_ElectricalVoltage
OST_Wire
OST_ElectricalCircuitTags
OST_ElectricalCircuit
OST_DuctCurvesRiseDrop
OST_FlexDuctCurvesPattern
OST_FlexDuctCurvesContour
OST_FlexDuctCurvesCenterLine
OST_FlexDuctCurves
OST_DuctAccessoryTags
OST_DuctAccessory
OST_DuctSystem
OST_DuctTerminalTags
OST_DuctTerminal
OST_DuctFitting
OST_DuctColorFills
OST_FlexDuctTags
OST_DuctTags
OST_DuctCurvesContour
OST_DuctCurvesCenterLine
OST_DuctCurves
OST_DuctColorFillLegends
OST_ConnectorElemZAxis
OST_ConnectorElemYAxis
OST_ConnectorElemXAxis
OST_ConnectorElem
OST_BridgeBearingTags
OST_BridgeGirderTags
OST_BridgeFoundationTags
OST_BridgeDeckTags
OST_BridgeArchTags
OST_BridgeCableTags
OST_BridgeTowerTags
OST_BridgePierTags
OST_BridgeAbutmentTags
OST_BridgeBearingHiddenLines
OST_BridgeGirderHiddenLines
OST_BridgeFoundationHiddenLines
OST_BridgeDeckHiddenLines
OST_BridgeArchHiddenLines
OST_BridgeCableHiddenLines
OST_BridgeTowerHiddenLines
OST_BridgePierHiddenLines
OST_BridgeAbutmentHiddenLines
OST_BridgeBearings
OST_BridgeGirders
OST_BridgeFoundations
OST_BridgeDecks
OST_BridgeArches
OST_BridgeCables
OST_BridgeTowers
OST_BridgePiers
OST_BridgeAbutments
OST_DesignOptions
OST_DesignOptionSets
OST_StructuralBracePlanReps
OST_StructConnectionSymbols
OST_StructuralAnnotations
OST_RevisionCloudTags
OST_Revisions
OST_RevisionClouds
OST_EditCutProfile
OST_ElevationMarks
OST_GridHeads
OST_LevelHeads
OST_DecalType
OST_DecalElement
OST_VolumeOfInterest
OST_BoundaryConditions
OST_InternalAreaLoadTags
OST_InternalLineLoadTags
OST_InternalPointLoadTags
OST_AreaLoadTags
OST_LineLoadTags
OST_PointLoadTags
OST_LoadCasesSeismic
OST_LoadCasesTemperature
OST_LoadCasesAccidental
OST_LoadCasesRoofLive
OST_LoadCasesSnow
OST_LoadCasesWind
OST_LoadCasesLive
OST_LoadCasesDead
OST_LoadCases
OST_InternalAreaLoads
OST_InternalLineLoads
OST_InternalPointLoads
OST_InternalLoads
OST_AreaLoads
OST_LineLoads
OST_PointLoads
OST_Loads
OST_BeamSystemTags
OST_FootingSpanDirectionSymbol
OST_SpanDirectionSymbol
OST_SpotSlopesSymbols
OST_SpotCoordinateSymbols
OST_SpotElevSymbols
OST_StructuralConnectionHandlerTags_Deprecated
OST_TrussTags
OST_KeynoteTags
OST_DetailComponentTags
OST_MaterialTags
OST_FloorTags
OST_CurtaSystemTags
OST_HostFinTags
OST_StairsTags
OST_MultiCategoryTags
OST_PlantingTags
OST_AreaTags
OST_StructuralFoundationTags
OST_StructuralColumnTags
OST_ParkingTags
OST_SiteTags
OST_StructuralFramingTags
OST_SpecialityEquipmentTags
OST_GenericModelTags
OST_CurtainWallPanelTags
OST_WallTags
OST_PlumbingFixtureTags
OST_MechanicalEquipmentTags
OST_LightingFixtureTags
OST_FurnitureSystemTags
OST_FurnitureTags
OST_ElectricalFixtureTags
OST_ElectricalEquipmentTags
OST_CeilingTags
OST_CaseworkTags
OST_Tags
OST_MEPSpaceColorFill
OST_MEPSpaceReference
OST_MEPSpaceInteriorFill
OST_MEPSpaceReferenceVisibility
OST_MEPSpaceInteriorFillVisibility
OST_MEPSpaces
OST_StackedWalls
OST_MassGlazingAll
OST_MassFloorsAll
OST_MassWallsAll
OST_MassExteriorWallUnderground
OST_MassSlab
OST_MassShade
OST_MassOpening
OST_MassSkylights
OST_MassGlazing
OST_MassRoof
OST_MassExteriorWall
OST_MassInteriorWall
OST_MassZone
OST_MassAreaFaceTags
OST_HostTemplate
OST_MassFaceSplitter
OST_MassCutter
OST_ZoningEnvelope
OST_MassTags
OST_MassForm
OST_MassFloor
OST_Mass
OST_DividedSurface_DiscardedDivisionLines
OST_DividedSurfaceBelt
OST_TilePatterns
OST_AlwaysExcludedInAllViews
OST_DividedSurface_TransparentFace
OST_DividedSurface_PreDividedSurface
OST_DividedSurface_PatternFill
OST_DividedSurface_PatternLines
OST_DividedSurface_Gridlines
OST_DividedSurface_Nodes
OST_DividedSurface
OST_RepeatingDetailLines
OST_RampsDownArrow
OST_RampsUpArrow
OST_RampsDownText
OST_RampsUpText
OST_RampsStringerAboveCut
OST_RampsStringer
OST_RampsAboveCut
OST_RampsIncomplete
OST_TrussDummy
OST_ZoneSchemes
OST_AreaSchemes
OST_Areas
OST_ProjectInformation
OST_Sheets
OST_ProfileFamilies
OST_DetailComponents
OST_RoofSoffit
OST_EdgeSlab
OST_Gutter
OST_Fascia
OST_Entourage
OST_Planting
OST_Blocks
OST_StructuralStiffenerHiddenLines
OST_StructuralColumnLocationLine
OST_StructuralFramingLocationLine
OST_StructuralStiffenerTags
OST_StructuralStiffener
OST_FootingAnalyticalGeometry
OST_RvtLinks
OST_Automatic
OST_SpecialityEquipment
OST_ColumnAnalyticalRigidLinks
OST_SecondaryTopographyContours
OST_TopographyContours
OST_TopographySurface
OST_Topography
OST_TopographyLink
OST_StructuralTruss
OST_StructuralColumnStickSymbols
OST_HiddenStructuralColumnLines
OST_AnalyticalRigidLinks
OST_ColumnAnalyticalGeometry
OST_FramingAnalyticalGeometry
OST_StructuralColumns
OST_HiddenStructuralFramingLines
OST_KickerBracing
OST_StructuralFramingSystem
OST_VerticalBracing
OST_HorizontalBracing
OST_Purlin
OST_Joist
OST_Girder
OST_StructuralFramingOther
OST_StructuralFraming
OST_HiddenStructuralFoundationLines
OST_StructuralFoundation
OST_BasePointAxisZ
OST_BasePointAxisY
OST_BasePointAxisX
OST_SharedBasePoint
OST_ProjectBasePoint
OST_SiteRegion
OST_SitePropertyLineSegmentTags
OST_SitePropertyLineSegment
OST_SitePropertyTags
OST_SitePointBoundary
OST_SiteProperty
OST_BuildingPad
OST_SitePoint
OST_SiteSurface
OST_Site
OST_Sewer
OST_Roads
OST_Property
OST_Parking
OST_PlumbingFixtures
OST_MechanicalEquipment
OST_LightingFixtureSource
OST_LightingFixtures
OST_FurnitureSystems
OST_ElectricalFixtures
OST_ElectricalEquipment
OST_Casework
OST_ArcWallRectOpening
OST_DormerOpeningIncomplete
OST_SWallRectOpening
OST_ShaftOpening
OST_StructuralFramingOpening
OST_ColumnOpening
OST_RiseDropSymbols
OST_PipeHydronicSeparationSymbols
OST_MechanicalEquipmentSetBoundaryLines
OST_MechanicalEquipmentSetTags
OST_MechanicalEquipmentSet
OST_AnalyticalPipeConnectionLineSymbol
OST_AnalyticalPipeConnections
OST_Coordination_Model
OST_MultistoryStairs
OST_HiddenStructuralConnectionLines_Deprecated
OST_StructuralConnectionHandler_Deprecated
OST_CoordinateSystem
OST_FndSlabLocalCoordSys
OST_FloorLocalCoordSys
OST_WallLocalCoordSys
OST_BraceLocalCoordSys
OST_ColumnLocalCoordSys
OST_BeamLocalCoordSys
OST_MultiReferenceAnnotations
OST_DSR_LeaderTickMarkStyleId
OST_DSR_InteriorTickMarkStyleId
OST_DSR_ArrowHeadStyleId
OST_DSR_CenterlineTickMarkStyleId
OST_DSR_CenterlinePatternCatId
OST_DSR_DimStyleHeavyEndCategoryId
OST_DSR_DimStyleHeavyEndCatId
OST_DSR_DimStyleTickCategoryId
OST_DSR_LineAndTextAttrFontId
OST_DSR_LineAndTextAttrCategoryId
OST_NodeAnalyticalTags
OST_LinkAnalyticalTags
OST_RailingRailPathExtensionLines
OST_RailingRailPathLines
OST_StairsSupports
OST_RailingHandRailAboveCut
OST_RailingTopRailAboveCut
OST_RailingTermination
OST_RailingSupport
OST_RailingHandRail
OST_RailingTopRail
OST_StairsSketchPathLines
OST_StairsTriserNumbers
OST_StairsTriserTags
OST_StairsSupportTags
OST_StairsLandingTags
OST_StairsRunTags
OST_StairsPathsAboveCut
OST_StairsPaths
OST_StairsRiserLinesAboveCut
OST_StairsRiserLines
OST_StairsOutlinesAboveCut
OST_StairsOutlines
OST_StairsNosingLinesAboveCut
OST_StairsNosingLines
OST_StairsCutMarksAboveCut
OST_StairsCutMarks
OST_ComponentRepeaterSlot
OST_ComponentRepeater
OST_DividedPath
OST_IOSRoomCalculationPoint
OST_PropertySet
OST_AppearanceAsset
OST_StairStringer2012_Deprecated
OST_StairsTrisers
OST_StairsLandings
OST_StairsRuns
OST_Stair2012_Deprecated
OST_RailingSystemTags
OST_RailingSystemTransition
OST_RailingSystemTermination
OST_RailingSystemRail
OST_RailingSystemTopRail
OST_RailingSystemHandRailBracket
OST_RailingSystemHandRail
OST_RailingSystemHardware
OST_RailingSystemPanel
OST_RailingSystemBaluster
OST_RailingSystemPost
OST_RailingSystemSegment
OST_RailingSystem
OST_AdaptivePoints_HiddenLines
OST_AdaptivePoints_Lines
OST_AdaptivePoints_Planes
OST_AdaptivePoints_Points
OST_AdaptivePoints
OST_CeilingOpening
OST_FloorOpening
OST_RoofOpening
OST_WallRefPlanes
OST_StructLocationLineControl
OST_DimLockControlLeader
OST_MEPSpaceSeparationLines
OST_AreaPolylines
OST_RoomPolylines
OST_InstanceDrivenLineStyle
OST_RemovedGridSeg
OST_IOSOpening
OST_IOSTilePatternGrid
OST_ControlLocal
OST_ControlAxisZ
OST_ControlAxisY
OST_ControlAxisX
OST_XRayConstrainedProfileEdge
OST_XRayImplicitPathCurve
OST_XRayPathPoint
OST_XRayPathCurve
OST_XRaySideEdge
OST_XRayProfileEdge
OST_ReferencePoints_HiddenLines
OST_ReferencePoints_Lines
OST_ReferencePoints_Planes
OST_ReferencePoints_Points
OST_ReferencePoints
OST_Materials
OST_CeilingsCutPattern
OST_CeilingsDefault
OST_CeilingsFinish2
OST_CeilingsFinish1
OST_CeilingsSubstrate
OST_CeilingsInsulation
OST_CeilingsStructure
OST_CeilingsMembrane
OST_FloorsInteriorEdges
OST_FloorsCutPattern
OST_HiddenFloorLines
OST_FloorsDefault
OST_FloorsFinish2
OST_FloorsFinish1
OST_FloorsSubstrate
OST_FloorsInsulation
OST_FloorsStructure
OST_FloorsMembrane
OST_RoofsInteriorEdges
OST_RoofsCutPattern
OST_RoofsDefault
OST_RoofsFinish2
OST_RoofsFinish1
OST_RoofsSubstrate
OST_RoofsInsulation
OST_RoofsStructure
OST_RoofsMembrane
OST_WallsCutPattern
OST_HiddenWallLines
OST_WallsDefault
OST_WallsFinish2
OST_WallsFinish1
OST_WallsSubstrate
OST_WallsInsulation
OST_WallsStructure
OST_WallsMembrane
OST_PreviewLegendComponents
OST_LegendComponents
OST_Schedules
OST_ScheduleGraphics
OST_RasterImages
OST_ColorFillSchema
OST_RoomColorFill
OST_ColorFillLegends
OST_AnnotationCropSpecial
OST_CropBoundarySpecial
OST_AnnotationCrop
OST_FloorsAnalyticalGeometry
OST_WallsAnalyticalGeometry
OST_CalloutLeaderLine
OST_CeilingsSurfacePattern
OST_RoofsSurfacePattern
OST_FloorsSurfacePattern
OST_WallsSurfacePattern
OST_CalloutBoundary
OST_CalloutHeads
OST_Callouts
OST_CropBoundary
OST_Elev
OST_AxisZ
OST_AxisY
OST_AxisX
OST_CLines
OST_Lights
OST_ViewportLabel
OST_Viewports
OST_Camera_Lines
OST_Cameras
OST_MEPSpaceTags
OST_RoomTags
OST_DoorTags
OST_WindowTags
OST_SectionHeadWideLines
OST_SectionHeadMediumLines
OST_SectionHeadThinLines
OST_SectionHeads
OST_ContourLabels
OST_CurtaSystemFaceManager
OST_CurtaSystem
OST_AreaReport_Arc_Minus
OST_AreaReport_Arc_Plus
OST_AreaReport_Boundary
OST_AreaReport_Triangle
OST_CurtainGridsCurtaSystem
OST_CurtainGridsSystem
OST_CurtainGridsWall
OST_CurtainGridsRoof
OST_HostFinHF
OST_HostFinWall
OST_HostFinCeiling
OST_HostFinRoof
OST_HostFinFloor
OST_HostFin
OST_AnalysisDisplayStyle
OST_AnalysisResults
OST_RenderRegions
OST_SectionBox
OST_TextNotes
OST_Divisions
OST_Catalogs
OST_DirectionEdgeLines
OST_CenterLines
OST_LinesBeyond
OST_HiddenLines
OST_DemolishedLines
OST_OverheadLines
OST_TitleBlockWideLines
OST_TitleBlockMediumLines
OST_TitleBlockThinLines
OST_TitleBlocks
OST_Views
OST_Viewers
OST_PartHiddenLines
OST_PartTags
OST_Parts
OST_AssemblyTags
OST_Assemblies
OST_RoofTags
OST_SpotSlopes
OST_SpotCoordinates
OST_SpotElevations
OST_Constraints
OST_WeakDims
OST_Dimensions
OST_Levels
OST_DisplacementPath
OST_DisplacementElements
OST_GridChains
OST_Grids
OST_BrokenSectionLine
OST_SectionLine
OST_Sections
OST_ReferenceViewer
OST_ReferenceViewerSymbol
OST_ImportObjectStyles
OST_ModelText
OST_MaskingRegion
OST_Matchline
OST_FaceSplitter
OST_PlanRegion
OST_FilledRegion
OST_MassingProjectionOutlines
OST_MassingCutOutlines
OST_Massing
OST_Reveals
OST_Cornices
OST_Ramps
OST_RailingBalusterRailCut
OST_RailingBalusterRail
OST_Railings
OST_CurtainGrids
OST_CurtainWallMullionsCut
OST_CurtainWallMullions
OST_CurtainWallPanels
OST_AreaReference
OST_AreaInteriorFill
OST_RoomReference
OST_RoomInteriorFill
OST_AreaColorFill
OST_AreaReferenceVisibility
OST_AreaInteriorFillVisibility
OST_RoomReferenceVisibility
OST_RoomInteriorFillVisibility
OST_Rooms
OST_GenericModel
OST_GenericAnnotation
OST_Fixtures
OST_StairsRailingTags
OST_StairsRailingAboveCut
OST_StairsDownArrows
OST_StairsUpArrows
OST_StairsDownText
OST_StairsRailingRail
OST_StairsRailingBaluster
OST_StairsRailing
OST_StairsUpText
OST_StairsSupportsAboveCut
OST_StairsStringerCarriage
OST_StairsAboveCut_ToBeDeprecated
OST_StairsIncomplete_Deprecated
OST_Stairs
OST_IOSNavWheelPivotBall
OST_IOSRoomComputationHeight
OST_IOSRoomUpperLowerLines
OST_IOSDragBoxInverted
OST_IOSDragBox
OST_Phases
OST_IOS_GeoSite
OST_IOS_GeoLocations
OST_IOSFabricReinSpanSymbolCtrl
OST_GuideGrid
OST_EPS_Future
OST_EPS_Temporary
OST_EPS_New
OST_EPS_Demolished
OST_EPS_Existing
OST_IOSMeasureLineScreenSize
OST_Columns
OST_IOSRebarSystemSpanSymbolCtrl
OST_IOSRoomTagToRoomLines
OST_IOSAttachedDetailGroups
OST_IOSDetailGroups
OST_IOSModelGroups
OST_IOSSuspendedSketch
OST_IOSWallCoreBoundary
OST_IOSMeasureLine
OST_IOSArrays
OST_Curtain_Systems
OST_IOSBBoxScreenSize
OST_IOSSlabShapeEditorPointInterior
OST_IOSSlabShapeEditorPointBoundary
OST_IOSSlabShapeEditorBoundary
OST_IOSSlabShapeEditorAutoCrease
OST_IOSSlabShapeEditorExplitCrease
OST_ReferenceLines
OST_IOSNotSilhouette
OST_FillPatterns
OST_Furniture
OST_AreaSchemeLines
OST_GenericLines
OST_InsulationLines
OST_CloudLines
OST_IOSRoomPerimeterLines
OST_IOSCuttingGeometry
OST_IOSCrashGraphics
OST_IOSGroups
OST_IOSGhost
OST_StairsSketchLandingCenterLines
OST_StairsSketchRunLines
OST_StairsSketchRiserLines
OST_StairsSketchBoundaryLines
OST_RoomSeparationLines
OST_AxisOfRotation
OST_InvisibleLines
OST_IOSThinPixel_DashDot
OST_IOSThinPixel_Dash
OST_IOSThinPixel_Dot
OST_Extrusions
OST_IOS
OST_CutOutlines
OST_IOSThinPixel
OST_IOSFlipControl
OST_IOSSketchGrid
OST_IOSSuspendedSketch_obsolete
OST_IOSFreeSnapLine
OST_IOSDatumPlane
OST_Lines
OST_IOSConstructionLine
OST_IOSAlignmentGraphics
OST_IOSAligningLine
OST_IOSBackedUpElements
OST_IOSRegeneratedElements
OST_SketchLines
OST_CurvesWideLines
OST_CurvesMediumLines
OST_CurvesThinLines
OST_Curves
OST_CeilingsProjection
OST_CeilingsCut
OST_Ceilings
OST_RoofsProjection
OST_RoofsCut
OST_Roofs
OST_FloorsProjection
OST_FloorsCut
OST_Floors
OST_DoorsGlassProjection
OST_DoorsGlassCut
OST_DoorsFrameMullionProjection
OST_DoorsFrameMullionCut
OST_DoorsOpeningProjection
OST_DoorsOpeningCut
OST_DoorsPanelProjection
OST_DoorsPanelCut
OST_Doors
OST_WindowsOpeningProjection
OST_WindowsOpeningCut
OST_WindowsSillHeadProjection
OST_WindowsSillHeadCut
OST_WindowsFrameMullionProjection
OST_WindowsFrameMullionCut
OST_WindowsGlassProjection
OST_WindowsGlassCut
OST_Windows
OST_WallsProjectionOutlines
OST_WallsCutOutlines
OST_Walls
OST_IOSRegenerationFailure
OST_ScheduleViewParamGroup
OST_MatchSiteComponent
OST_MatchProfile
OST_MatchDetail
OST_MatchAnnotation
OST_MatchModel
OST_MatchAll
INVALID

FAQ on License

Many users asked about license options. Here are my answers for the most frequent questions:

Q: Do I need an Autodesk account to use the app?

A: For paid apps, yes. Every end user needs login in Revit using an Autodesk account, and the app will check the account’s available license before running. The license can be obtained either directly from purchase, or from redistribution from another Autodesk account.

Q: I am a BIM manager, I purchased multiple copies of your app. How do I assign my end users these licenses?

A: See this page’s “Multi-seat license distribution”

App Buyer’s Information

Three things to note:

1, You can only redistribute one seat to one user account. Transferring of multiple seats is not possible.

2, Once an end user downloads a copies, one seat is permanently bond to that user’s account.

3, There must be at least one seat remaining on your purchasing account.

Example: you purchased 10 copies of app X, using account Admin, and there are 10 seats under Admin. You send user A a link to let her download app X. Once she downloads app X, 1 seat is considered “consumed”, and that seat is permanently under user A’s account. Now the admin account will have 9 seats. You can redistribute up to 9 seats to 9 end users accounts, leaving minimum of 1 seat under admin account, which is a limitation from the App Store. If the admin account is not one of the end user, and you have 10 end users needing license, as a work around I can manually give you 1 extra seat for redistribution.

Q: I want to use one account for purchasing, and another for management. Is it possible?

A:  Yes there is a way to do that. Instead of purchasing in App Store, you can email me the quantity of seats you need, and the account you want to use to redistribute these seats to end users, I will give you those seats, and send an invoice to the person/account for purchasing.

Q: Is there a floating license option?

A: Sorry, the only options are mentioned above.

 

Revit Plugin:User Editing History

01 main window

User Editing History (Trial)

User Editing History

This tool shows and manages all users’ editing history and other records that were created by End User Assistant. It also provide control over End User Assistant setting on local user’s machine.

See THIS POST to learn more about End User Assistant and what happens on local user’s machine. In this post, some work flow of End User Assistant is also mentioned as necessary.

To explain how this tool works, let’s break it down to some key concepts and functions:

Transaction

A “transaction” is a change applied to the model, such as creating a wall, or renaming a family type. Each transaction has a name assigned to it, and that is the same name we can see in the undo list.

One transaction often affects multiple elements, some might get created, others might get modified or deleted. EUA will record them as lists of unique ids. Sometimes the number of affected elements are so many that it is hard to make sense of all those records. Therefore EUA will also try to get user’s selection right before and after each transaction, so we can tell which element(s) the user was operating on. So, a total of five lists of relevant elements are linked with one transaction: added, modified, deleted, selection before, selection after.

User Work Session

A “user work session” contains all the records of a user between two save/sync. During one user work session, End User Assistant (EUA) gathers information right after each transaction. Right before a save/sync, EUA processes these transaction information, gather some more information from the model, reorganize them, and saved into the model. Then, User Editing History (UEH) simply reads these records from the model, and provide ways to search/filter/manage these records.

History Records per Element

UEH shows a list of records, and each record item shows what happened for one Revit element during one user work session, providing information about the element, the user, time, and a list of transactions that affected this element.

An element could have been created/modified/deleted during one user work session. If an element was created/deleted during one transaction, it will be shown as created/deleted, even if there are other transactions during which this element was modified.

There won’t be record for elements that are created and deleted during the same user work session.

“Id” vs. “Unique Id”

If you are a BIM Manager, you are probably familiar with element’s id. It is an integer number for identifying individual element. What you might not know is that element id is subject to change for the same element in a work-sharing environment. (learn more for why this happens) Therefore, Revit has another set of element identifiers called “unique id”, and they will never change. For UEH, you can see both Id and Unique Id been used, but keep in mind that different Ids could be pointing to the same element, and one Id could be used by multiple elements during different user sessions, but one Unique Id only marries with one element. That makes Unique Id the true identifier for Revit elements.

Selected Elements Before/After Transaction

EUA will request Revit for user’s selected element after each mouse click, because that’s the most common way elements are selected in Revit by end users. There are other ways to select elements, such as by element id, or through API, and EUA does not monitor selection change by these routes. After each transaction, EUA makes another request for user selection.

Here is what happens when a user deletes an element: user selects that element, EUA gets selection of one element, user hit delete key, Revit start and finish “delete selection” transaction, EUA gets selection after transaction (which should be empty).

One known issue here is that if Revit did not idle at all between the selecting by mouse and deleting by keyboard, because the user did these two in a very fast manor, EUA might not be able to get the correct selection before the deletion, simply because Revit didn’t have time to take any request from EUA. In this case, selection before might be wrong elements or empty, and selection after will be empty because the selection was deleted. This issue is only with deleting. Creation and modification will always show the correct user selection after the transaction.

Deleted Elements & Model Snapshot

EUA might show a progress window saying “Get model snapshot” right after sync and reload latest, and it might take 15-20 seconds to complete for large models. This is a necessary technical solution for recording deleted elements. Revit API only reports the id numbers of affected element during a transaction. By the time EUA tries to get more info of those elements, the ones deleted were already gone. That’s why old versions of UEH does not show any info of a deleted element other than its id number. What model snapshot does is scan and record basic information of all eligible elements in the model, so that when an element is deleted, EUA can look up its id here and get its other info.

As mentioned in “Id vs. Unique Id”, id numbers are subject to change, and this change could happen after sync/reload latest, when the local model merges data from the central. That’s why EUA needs to take model snapshot at these two events, so that id numbers are correctly mapped to unique ids.

When EUA takes model snapshot, it only looks for elements of certain categories, so we can concentrate on only those elements that we care about. It also helps shorten the time needed for taking a model snapshot. You can find this list here. Please feel free to let me know if you think there needs to be more or less categories.

Save & Load File

For each user work session, EUA creates one special Revit element called Data Storage, and save it into the model. This type of element is for storing data only and is only accessible through Revit API. Although the number of user work sessions shouldn’t be big enough to have impact on Revit performance, these data storage elements do have impact on the file size of the model. It is a good idea to save these data to an external file, and delete all record inside the model once in a while, so the file size does not swell. UEH provides ways to load, save and merge these files into or out-of the model.

User Control Center

in this module, UEH can control the end user’s ability to turn off EUA monitors by themselves. This control is per model, not per user or machine. Change to this setting needs a sync to central to take effect.

It also shows important user operations that are non-transactional, such opening the model, save, sync, reload latest, and turning on/off EUA monitors. The on/off status of EUA monitors are recorded with each user operation.

Future Release

As always, suggestions for future releases are most welcomed. Feel free to contact me if you want specific function in the plugin, or if your firm has special demands that could be best met by a more customized tool.

ACKNOWLEDGEMENT

Special thanks to Ryan Borszich, for his ideas and suggestions on the development of this plugin.

 

Revit plugin: End User Assistant

01 setting window

End User Assistant

The purpose of this tool is to run at the background of a Revit work session, monitor user’s operations, gather and save data for other tools to use. As of right now, it works with other 2 plugins from DZ studio: Revision Cloud Manager and User Editing History.

See THIS POST about how User Editing History (UEH) works. In this post UEH is also mentioned and explained as needed.

To explain how this tool works, let’s break it down to some key concepts and functions:

 

Revision Cloud Monitor

This monitor makes sure the user is aware that he needs to use the “Comments” property of revision cloud to describe what this cloud is about, so Revision Cloud Manager can use the info to generate a narrative.

Work Session Monitor

This monitor records non-transactional operations during a user work session. Right now it will record the following operations: open/create model, sync, reload latest, turn on/off monitors.

Editing History Monitor

This monitor records transactional operations that changes the model. Right now this monitor does the heavy work, and the rest of this post talks about how this monitor works.

TRANSACTION

A “transaction” is a change applied to the model, such as creating a wall, or renaming a family type. Each transaction has a name assigned to it, and that is the same name we can see in the undo list.

One transaction often affects multiple elements, some might get created, others might get modified or deleted. EUA will record them as lists of unique ids. Sometimes the number of affected elements are so many that it is hard to make sense of all those records. Therefore EUA will also try to get user’s selection right before and after each transaction, so we can tell which element(s) the user was operating on. So, a total of five lists of relevant elements are linked with one transaction: added, modified, deleted, selection before, selection after.

USER WORK SESSION

A “user work session” contains all the records of a user between two save/sync. During one user work session, End User Assistant (EUA) gathers information right after each transaction. Right before a save/sync, EUA processes these transaction information, gather some more information from the model, reorganize them, and saved into the model. Then, User Editing History (UEH) simply reads these records from the model, and provide ways to search/filter/manage these records.

EDITING HISTORY RECORDS

UEH shows a list of records, and each record item shows what happened for one Revit element during one user work session, providing information about the element, the user, time, and a list of transactions that affected this element.

An element could have been created/modified/deleted during one user work session. If an element was created/deleted during one transaction, it will be shown as created/deleted, even if there are other transactions during which this element was modified.

There won’t be record for elements that are created and deleted during the same user work session.

“ID” VS. “UNIQUE ID”

If you are a BIM Manager, you are probably familiar with element’s id. It is an integer number for identifying individual element. What you might not know is that element id is subject to change for the same element in a work-sharing environment. (learn more for why this happens) Therefore, Revit has another set of element identifiers called “unique id”, and they will never change. For UEH, you can see both Id and Unique Id been used, but keep in mind that different Ids could be pointing to the same element, and one Id could be used by multiple elements during different user sessions, but one Unique Id only marries with one element. That makes Unique Id the true identifier for Revit elements.

SELECTED ELEMENTS BEFORE/AFTER TRANSACTION

EUA will request Revit for user’s selected element after each mouse click, because that’s the most common way elements are selected in Revit by end users. There are other ways to select elements, such as by element id, or through API, and EUA does not monitor selection change by these routes. After each transaction, EUA makes another request for user selection.

Here is what happens when a user deletes an element: user selects that element, EUA gets selection of one element, user hit delete key, Revit start and finish “delete selection” transaction, EUA gets selection after transaction (which should be empty).

One known issue here is that if Revit did not idle at all between the selecting by mouse and deleting by keyboard, because the user did these two in a very fast manor, EUA might not be able to get the correct selection before the deletion, simply because Revit didn’t have time to take any request from EUA. In this case, selection before might be wrong elements or empty, and selection after will be empty because the selection was deleted. This issue is only with deleting. Creation and modification will always show the correct user selection after the transaction.

DELETED ELEMENTS & MODEL SNAPSHOT

EUA might show a progress window saying “Get model snapshot” right after sync and reload latest, and it might take 15-20 seconds to complete for large models. This is a necessary technical solution for recording deleted elements. Revit API only reports the id numbers of affected element during a transaction. By the time EUA tries to get more info of those elements, the ones deleted were already gone. That’s why old versions of UEH does not show any info of a deleted element other than its id number. What model snapshot does is scan and record basic information of all eligible elements in the model, so that when an element is deleted, EUA can look up its id here and get its other info.

As mentioned in “Id vs. Unique Id”, id numbers are subject to change, and this change could happen after sync/reload latest, when the local model merges data from the central. That’s why EUA needs to take model snapshot at these two events, so that id numbers are correctly mapped to unique ids.

When EUA takes model snapshot, it only looks for elements of certain categories, so we can concentrate on only those elements that we care about. It also helps shorten the time needed for taking a model snapshot. You can find this list here. Please feel free to let me know if you think there needs to be more or less categories.

Turn Off Monitors

In a work-shared model, EUA monitors are turned on and cannot be turned off by default. Use UEH to setup control mechanism for the model, and choose if users are allowed to turn off monitors by themselves.

 

FUTURE RELEASES

As always, suggestions for future releases are most welcomed. Feel free to contact me if you want specific function in the plugin, or if your firm has special demands that could be best met by a more customized tool.

Revit plugin: Revision + Cloud Manager

Screenshot (3)Screenshot (2)01Screenshot (5)

07

This is a one-stop solution for managing revision clouds and revisions in Revit. It is one of the most popular paid apps in Autodesk App Store. Give it a try!

I am constantly updating my products in response to user’s feedback. Don’t hesitate to contact me if you have any questions or problem using the tools, as well as any comments and suggestions. Your feedback is most welcomed!

Revision + Cloud Manager (Trial)

Revision + Cloud Manager

Other products of DZ Studio

FEATURE BLOCK – Revision Cloud Manager

This plugin finds all revision clouds in the model, group them by revision, let the user select the revision(s) to show in a table. By right-clicking on the column header, it allows selecting which properties need to be shown. It collects all necessary information directly from Revit model, and let the user export the table as Excel file.

Using Cloud’s Comments

This plugin can read and write “Comments” property. End User Assistant plugin can remind Revit user to write something into Comments property as a description. FYI, Comments property supports multiple lines text. To achieve that, type some lines in notepad/Word, then copy-paste it into Comments property. The plugin supports multi-line-text too. Similar to Excel, you need to press Shift + Enter to enter  a new line.

Export to Excel

Export all clouds and selected properties as an Excel table.

Clouds on Sheet

If there is cloud on sheet, please run “Verify Detail Number” at least once to get the correct result. More is explained in “Issues” later.

Clouds in Dependent View

If there is any dependent views that has cloud in it, please run “Verify Visibility” to get the correct result. More is explained in “”Issues” later.

Last Edited By

From version 1.1.0, this plugin can read the history data collected by End User Assistant plugin, and show the user who did the last editing to a cloud.

“View Title” Parameter

This parameter is a combination of “Title On Sheet” and “View Name”. It will show “Title On Sheet” if possible, otherwise “View Name”, so it is consistent with what’s showing on sheet.

FEATURE BLOCK – Revision Manager

From version 1.2, Revision Manager is available for managing sheets based on revisions. It finds all revisions and sheets in a project, and provides convenient features of managing sheets.

Select Sheets of Revisions

Select sheets of selected revisions.

Batch Assign/Remove 

Select multiple revisions and sheets, assign/remove these revisions to/from these sheets.

Save Printset

Save selected sheets into a printset for later use.

Export Sheet List or Matrix

Export sheet list or a revision matrix (or Issue Sheet, or whatever you call it) from selected sheets to an Excel file. You can select what parameters to be included.

ISSUES

Verify Detail Number: If a cloud is on a sheet, Revit is not smart enough to tell which viewport the cloud is on. This app finds this missing piece of information, eliminating the need of manual effort, thus minimize room for error.

Click “Verify Detail Numbers” in the main menu to start a full scan for all clouds showing in the table. Right click on one row and then click “Refresh“ will update detail number of that row’s cloud.

If the model is large, the time needed for the plugin to find detail numbers for all clouds might be quite long. This issue is caused by Revit’s internal workflow of sheet regenerating.When you hit “Verify Detail Number”, the plugin will give a warning message and an estimation of needed time, letting the user decide whether to proceed now or later. To grant enough time for the plugin to work its way, simply let it run while you are attending a meeting, having lunch or doing other non-Revit tasks.

After finding the correct detail number for a cloud, the plugin will save it for future use. However, if the detail number of a drawing changes, the saved detail number will NOT update. Therefore, you should at least verify detail number once each time you run the plugin.

Verify Visibility: When dependent views are involved, note that initially, this app will list out the same cloud multiple times, one for every parent/dependent view, regardless of whether the cloud is actually showing up in that view. You need to run “Verify Visibility” to let the app find out whether the cloud is showing up or not. Similar to the process of verifying detail number, this command might take some time to finish, if the model is large and complex.

Verify visibility will also find out if a cloud is hidden by various settings, such as hide element or category. At least verify visibility once each time you run the plugin.

FUTURE RELEASES

As always, suggestions for future releases are most welcomed. Feel free to contact me if you want specific function in the plugin, or if your firm has special demands that could be best met by a more customized tool.