<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: elements event in Revit API Forum</title>
    <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247842#M66592</link>
    <description>&lt;P&gt;Dear,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;i think no you can find document change event.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following are document events. You can check in apps while writing cod&lt;IMG src="https://forums.autodesk.com/t5/image/serverpage/image-id/229109i4360B24AD3D4D9EA/image-size/original?v=lz-1&amp;amp;px=-1" border="0" alt="DocumentEvent.png" title="DocumentEvent.png" /&gt;e.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Entire code for DMU example but better you read post from given link.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.Automatic )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;AlignRebar&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalApplication&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; On shutdown, unregister the updater&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; OnShutdown( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; updater
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;( a.ActiveAddInId );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.UnregisterUpdater(
&amp;nbsp; &amp;nbsp; &amp;nbsp; updater.GetUpdaterId() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; On start up, add UI buttons, register &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; the updater and add triggers&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; OnStartup( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Add the UI buttons on start up&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; AddButtons( a );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; updater = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;(
&amp;nbsp; &amp;nbsp; &amp;nbsp; a.ActiveAddInId );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Register the updater in the singleton &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// UpdateRegistry class&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.RegisterUpdater( updater );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Set the filter; in this case we &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// shall work with beams specifically&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementCategoryFilter&lt;/SPAN&gt; filter
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ElementCategoryFilter&lt;/SPAN&gt;(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;BuiltInCategory&lt;/SPAN&gt;.OST_StructuralFraming );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Add trigger &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.AddTrigger(
&amp;nbsp; &amp;nbsp; &amp;nbsp; updater.GetUpdaterId(), filter,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Element&lt;/SPAN&gt;.GetChangeTypeGeometry() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Add UI buttons&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; AddButtons( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// create a ribbon panel on the Analyze tab&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RibbonPanel&lt;/SPAN&gt; panel = a.CreateRibbonPanel(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Tab&lt;/SPAN&gt;.Analyze, &lt;SPAN&gt;"RST Labs"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; AddDmuCommandButtons( panel );
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Control buttons for the Dynamic Model Update &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; AddDmuCommandButtons(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RibbonPanel&lt;/SPAN&gt; panel )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;string&lt;/SPAN&gt; path = GetType().Assembly.Location;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;string&lt;/SPAN&gt; sDirectory
&amp;nbsp; &amp;nbsp; &amp;nbsp; = System.IO.&lt;SPAN&gt;Path&lt;/SPAN&gt;.GetDirectoryName( path );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// create toggle buttons for radio button group &lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt; toggleButtonData3 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RSTLabsDMUOff"&lt;/SPAN&gt;, &lt;SPAN&gt;"Align Off"&lt;/SPAN&gt;, path, 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RstAvfDmu.UIDynamicModelUpdateOff"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; toggleButtonData3.LargeImage 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;BitmapImage&lt;/SPAN&gt;( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Uri&lt;/SPAN&gt;( sDirectory 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &lt;SPAN&gt;"\\Images\\"&lt;/SPAN&gt; + &lt;SPAN&gt;"Families.ico"&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt; toggleButtonData4 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RSTLabsDMUOn"&lt;/SPAN&gt;, &lt;SPAN&gt;"Align On"&lt;/SPAN&gt;, path, 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RstAvfDmu.UIDynamicModelUpdateOn"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; toggleButtonData4.LargeImage 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;BitmapImage&lt;/SPAN&gt;( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Uri&lt;/SPAN&gt;( sDirectory 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &lt;SPAN&gt;"\\Images\\"&lt;/SPAN&gt; + &lt;SPAN&gt;"Families.ico"&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// make dyn update on/off radio button group &lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RadioButtonGroupData&lt;/SPAN&gt; radioBtnGroupData2 = 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RadioButtonGroupData&lt;/SPAN&gt;( &lt;SPAN&gt;"RebarAlign"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RadioButtonGroup&lt;/SPAN&gt; radioBtnGroup2 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = panel.AddItem( radioBtnGroupData2 ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;RadioButtonGroup&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; radioBtnGroup2.AddItem( toggleButtonData3 );
&amp;nbsp; &amp;nbsp; radioBtnGroup2.AddItem( toggleButtonData4 );
&amp;nbsp; }
}
&amp;nbsp;
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; : &lt;SPAN&gt;IUpdater&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;bool&lt;/SPAN&gt; m_updateActive = &lt;SPAN&gt;false&lt;/SPAN&gt;;
&amp;nbsp; &lt;SPAN&gt;AddInId&lt;/SPAN&gt; addinID = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt; updaterID = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; RebarUpdater( &lt;SPAN&gt;AddInId&lt;/SPAN&gt; id )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; addinID = id;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// UpdaterId that is used to register and &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// unregister updaters and triggers&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; updaterID = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt;( addinID, &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Guid&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"63CDBB88-5CC4-4ac3-AD24-52DD435AAB25"&lt;/SPAN&gt; ) );
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Align rebar to updated beam &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Execute( &lt;SPAN&gt;UpdaterData&lt;/SPAN&gt; data )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( m_updateActive == &lt;SPAN&gt;false&lt;/SPAN&gt; ) { &lt;SPAN&gt;return&lt;/SPAN&gt;; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Get access to document object&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Document&lt;/SPAN&gt; doc = data.GetDocument();
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;try&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Loop through all the modified elements&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;ElementId&lt;/SPAN&gt; id &lt;SPAN&gt;in&lt;/SPAN&gt; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.GetModifiedElementIds() )
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt; beam = doc.get_Element( id ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Create a filter to retrieve all rebars&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FilteredElementCollector&lt;/SPAN&gt; rebars 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;FilteredElementCollector&lt;/SPAN&gt;( doc );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebars.OfCategory( &lt;SPAN&gt;BuiltInCategory&lt;/SPAN&gt;.OST_Rebar );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebars.OfClass( &lt;SPAN&gt;typeof&lt;/SPAN&gt;( &lt;SPAN&gt;Rebar&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;Rebar&lt;/SPAN&gt; rebar &lt;SPAN&gt;in&lt;/SPAN&gt; rebars )
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Calculate the beam line&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; beamStartPoint = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;();
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; beamEndPoint = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;();
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; line = CalculateBeamLine( beam );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Get the start and end point &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; != line )
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; beamStartPoint = line.get_EndPoint( 0 );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; beamEndPoint = line.get_EndPoint( 1 );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// To align the rebar to the new beam's &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// length, we split the tasks in two stages&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Step 1: Move the rebar to align with one &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// of the end of the beam&lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// For this we first access the &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// rebar line geometry&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; rebarLine = rebar.Curves.get_Item( 0 ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Calculate the translation vector &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// (the extent of the move)&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; transVec = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;( beamStartPoint.X 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - rebarLine.get_EndPoint( 0 ).X, 0.0, 0.0 );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Perform the move &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; doc.Move( rebar, transVec );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// This move causes the beam line to change &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// and so recalculating the beam line&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; line = CalculateBeamLine( beam );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Step 2: Set the new length of the rebar &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// based on new beam length. For this, we &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// can set the relevant parameter after &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// checking at UI&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebar.get_Parameter( &lt;SPAN&gt;"B"&lt;/SPAN&gt; ).Set( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetLength( line ) );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;catch&lt;/SPAN&gt;( &lt;SPAN&gt;Exception&lt;/SPAN&gt; ex )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;TaskDialog&lt;/SPAN&gt;.Show( &lt;SPAN&gt;"Exception"&lt;/SPAN&gt;, ex.Message );
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;// Calculate the beam line &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;private&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt; CalculateBeamLine( 
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt; beam )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;GeometryElement&lt;/SPAN&gt; geoElement 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = beam.get_Geometry( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Options&lt;/SPAN&gt;() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; == geoElement 
&amp;nbsp; &amp;nbsp; &amp;nbsp; || 0 == geoElement.Objects.Size )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;throw&lt;/SPAN&gt; &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Exception&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"Can't get the geometry of selected element."&lt;/SPAN&gt; );
&amp;nbsp; &amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; beamLine = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;GeometryObject&lt;/SPAN&gt; geoObject 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;in&lt;/SPAN&gt; geoElement.Objects )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// get the driving path and vector of the beam &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; beamLine = geoObject &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; != beamLine )
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; beamLine;
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the length of the given line&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;double&lt;/SPAN&gt; GetLength( &lt;SPAN&gt;Line&lt;/SPAN&gt; line )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; v = line.get_EndPoint( 1 ) - line.get_EndPoint( 0 );
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; v.GetLength();
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the auxiliary string&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; GetAdditionalInformation()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"Automatically align rebar to match beam"&lt;/SPAN&gt;;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Set the priority&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;ChangePriority&lt;/SPAN&gt; GetChangePriority()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;ChangePriority&lt;/SPAN&gt;.Rebar;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the updater Id&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt; GetUpdaterId()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; updaterID;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the updater name&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; GetUpdaterName()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"Rebar alignment updater"&lt;/SPAN&gt;;
&amp;nbsp; }
}
&amp;nbsp;
[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.ReadOnly )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;UIDynamicModelUpdateOff&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalCommand&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; Execute(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ExternalCommandData&lt;/SPAN&gt; commandData,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ref&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; message,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementSet&lt;/SPAN&gt; elements )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;.m_updateActive = &lt;SPAN&gt;false&lt;/SPAN&gt;;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
}
&amp;nbsp;
[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.ReadOnly )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;UIDynamicModelUpdateOn&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalCommand&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; Execute(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ExternalCommandData&lt;/SPAN&gt; commandData,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ref&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; message,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementSet&lt;/SPAN&gt; elements )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;.m_updateActive = &lt;SPAN&gt;true&lt;/SPAN&gt;;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sat, 02 Apr 2016 11:03:19 GMT</pubDate>
    <dc:creator>Anonymous</dc:creator>
    <dc:date>2016-04-02T11:03:19Z</dc:date>
    <item>
      <title>elements event</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247788#M66588</link>
      <description>&lt;P&gt;I need&amp;nbsp;acquire event of elements .For example,&amp;nbsp;picked or double-click with a wall,&amp;nbsp;when I need access&amp;nbsp;the member function. But,there are no picked or double-click events in the Revit API. What should I do.&lt;/P&gt;&lt;P&gt;Thanks:&lt;/P&gt;&lt;P&gt;xiaosz&lt;/P&gt;</description>
      <pubDate>Sat, 02 Apr 2016 09:42:07 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247788#M66588</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-04-02T09:42:07Z</dc:date>
    </item>
    <item>
      <title>Re: elements event</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247798#M66589</link>
      <description>&lt;P&gt;Dear xiaosz,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;you can write triggers for element modification/Addition/Deletion. you cannot find double click event&amp;nbsp;on element .&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Please see this post for DMU(Dynamic Model Updater). and you can also find more using DMU you can write triggers on element event.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;A href="http://thebuildingcoder.typepad.com/blog/2010/08/structural-dynamic-model-update-sample.html" target="_self"&gt;http://thebuildingcoder.typepad.com/blog/2010/08/structural-dynamic-model-update-sample.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;</description>
      <pubDate>Sat, 02 Apr 2016 09:52:51 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247798#M66589</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-04-02T09:52:51Z</dc:date>
    </item>
    <item>
      <title>Re: elements event</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247827#M66590</link>
      <description>Dear BholaDev,&lt;BR /&gt;Think you very much.&lt;BR /&gt;I can't access the URL. &lt;A href="http://thebuildingcoder.typepad.com/blog/2010/08/s​tructural-dynamic-model-update-sample.html" target="_blank"&gt;http://thebuildingcoder.typepad.com/blog/2010/08/s​tructural-dynamic-model-update-sample.html&lt;/A&gt;&lt;BR /&gt;Can you help me copy in this post.</description>
      <pubDate>Sat, 02 Apr 2016 10:37:59 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247827#M66590</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-04-02T10:37:59Z</dc:date>
    </item>
    <item>
      <title>Re: elements event</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247834#M66591</link>
      <description>another question, Can I find double click event in revit application or document.</description>
      <pubDate>Sat, 02 Apr 2016 10:46:27 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247834#M66591</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-04-02T10:46:27Z</dc:date>
    </item>
    <item>
      <title>Re: elements event</title>
      <link>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247842#M66592</link>
      <description>&lt;P&gt;Dear,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;i think no you can find document change event.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following are document events. You can check in apps while writing cod&lt;IMG src="https://forums.autodesk.com/t5/image/serverpage/image-id/229109i4360B24AD3D4D9EA/image-size/original?v=lz-1&amp;amp;px=-1" border="0" alt="DocumentEvent.png" title="DocumentEvent.png" /&gt;e.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Entire code for DMU example but better you read post from given link.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.Automatic )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;AlignRebar&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalApplication&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; On shutdown, unregister the updater&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; OnShutdown( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; updater
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;( a.ActiveAddInId );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.UnregisterUpdater(
&amp;nbsp; &amp;nbsp; &amp;nbsp; updater.GetUpdaterId() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; On start up, add UI buttons, register &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; the updater and add triggers&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; OnStartup( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Add the UI buttons on start up&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; AddButtons( a );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; updater = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;(
&amp;nbsp; &amp;nbsp; &amp;nbsp; a.ActiveAddInId );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Register the updater in the singleton &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// UpdateRegistry class&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.RegisterUpdater( updater );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Set the filter; in this case we &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// shall work with beams specifically&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementCategoryFilter&lt;/SPAN&gt; filter
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ElementCategoryFilter&lt;/SPAN&gt;(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;BuiltInCategory&lt;/SPAN&gt;.OST_StructuralFraming );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Add trigger &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;UpdaterRegistry&lt;/SPAN&gt;.AddTrigger(
&amp;nbsp; &amp;nbsp; &amp;nbsp; updater.GetUpdaterId(), filter,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Element&lt;/SPAN&gt;.GetChangeTypeGeometry() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Add UI buttons&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; AddButtons( &lt;SPAN&gt;UIControlledApplication&lt;/SPAN&gt; a )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// create a ribbon panel on the Analyze tab&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RibbonPanel&lt;/SPAN&gt; panel = a.CreateRibbonPanel(
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Tab&lt;/SPAN&gt;.Analyze, &lt;SPAN&gt;"RST Labs"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; AddDmuCommandButtons( panel );
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Control buttons for the Dynamic Model Update &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; AddDmuCommandButtons(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RibbonPanel&lt;/SPAN&gt; panel )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;string&lt;/SPAN&gt; path = GetType().Assembly.Location;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;string&lt;/SPAN&gt; sDirectory
&amp;nbsp; &amp;nbsp; &amp;nbsp; = System.IO.&lt;SPAN&gt;Path&lt;/SPAN&gt;.GetDirectoryName( path );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// create toggle buttons for radio button group &lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt; toggleButtonData3 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RSTLabsDMUOff"&lt;/SPAN&gt;, &lt;SPAN&gt;"Align Off"&lt;/SPAN&gt;, path, 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RstAvfDmu.UIDynamicModelUpdateOff"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; toggleButtonData3.LargeImage 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;BitmapImage&lt;/SPAN&gt;( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Uri&lt;/SPAN&gt;( sDirectory 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &lt;SPAN&gt;"\\Images\\"&lt;/SPAN&gt; + &lt;SPAN&gt;"Families.ico"&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt; toggleButtonData4 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;ToggleButtonData&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RSTLabsDMUOn"&lt;/SPAN&gt;, &lt;SPAN&gt;"Align On"&lt;/SPAN&gt;, path, 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"RstAvfDmu.UIDynamicModelUpdateOn"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; toggleButtonData4.LargeImage 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;BitmapImage&lt;/SPAN&gt;( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Uri&lt;/SPAN&gt;( sDirectory 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + &lt;SPAN&gt;"\\Images\\"&lt;/SPAN&gt; + &lt;SPAN&gt;"Families.ico"&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// make dyn update on/off radio button group &lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RadioButtonGroupData&lt;/SPAN&gt; radioBtnGroupData2 = 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;RadioButtonGroupData&lt;/SPAN&gt;( &lt;SPAN&gt;"RebarAlign"&lt;/SPAN&gt; );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RadioButtonGroup&lt;/SPAN&gt; radioBtnGroup2 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = panel.AddItem( radioBtnGroupData2 ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;RadioButtonGroup&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; radioBtnGroup2.AddItem( toggleButtonData3 );
&amp;nbsp; &amp;nbsp; radioBtnGroup2.AddItem( toggleButtonData4 );
&amp;nbsp; }
}
&amp;nbsp;
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt; : &lt;SPAN&gt;IUpdater&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;bool&lt;/SPAN&gt; m_updateActive = &lt;SPAN&gt;false&lt;/SPAN&gt;;
&amp;nbsp; &lt;SPAN&gt;AddInId&lt;/SPAN&gt; addinID = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt; updaterID = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; RebarUpdater( &lt;SPAN&gt;AddInId&lt;/SPAN&gt; id )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; addinID = id;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// UpdaterId that is used to register and &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// unregister updaters and triggers&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; updaterID = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt;( addinID, &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Guid&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"63CDBB88-5CC4-4ac3-AD24-52DD435AAB25"&lt;/SPAN&gt; ) );
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Align rebar to updated beam &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;void&lt;/SPAN&gt; Execute( &lt;SPAN&gt;UpdaterData&lt;/SPAN&gt; data )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( m_updateActive == &lt;SPAN&gt;false&lt;/SPAN&gt; ) { &lt;SPAN&gt;return&lt;/SPAN&gt;; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Get access to document object&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Document&lt;/SPAN&gt; doc = data.GetDocument();
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;try&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Loop through all the modified elements&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;ElementId&lt;/SPAN&gt; id &lt;SPAN&gt;in&lt;/SPAN&gt; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data.GetModifiedElementIds() )
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt; beam = doc.get_Element( id ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Create a filter to retrieve all rebars&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FilteredElementCollector&lt;/SPAN&gt; rebars 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;FilteredElementCollector&lt;/SPAN&gt;( doc );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebars.OfCategory( &lt;SPAN&gt;BuiltInCategory&lt;/SPAN&gt;.OST_Rebar );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebars.OfClass( &lt;SPAN&gt;typeof&lt;/SPAN&gt;( &lt;SPAN&gt;Rebar&lt;/SPAN&gt; ) );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;Rebar&lt;/SPAN&gt; rebar &lt;SPAN&gt;in&lt;/SPAN&gt; rebars )
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Calculate the beam line&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; beamStartPoint = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;();
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; beamEndPoint = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;();
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; line = CalculateBeamLine( beam );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Get the start and end point &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; != line )
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; beamStartPoint = line.get_EndPoint( 0 );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; beamEndPoint = line.get_EndPoint( 1 );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// To align the rebar to the new beam's &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// length, we split the tasks in two stages&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Step 1: Move the rebar to align with one &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// of the end of the beam&lt;/SPAN&gt;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// For this we first access the &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// rebar line geometry&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; rebarLine = rebar.Curves.get_Item( 0 ) 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Calculate the translation vector &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// (the extent of the move)&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; transVec = &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;XYZ&lt;/SPAN&gt;( beamStartPoint.X 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - rebarLine.get_EndPoint( 0 ).X, 0.0, 0.0 );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Perform the move &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; doc.Move( rebar, transVec );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// This move causes the beam line to change &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// and so recalculating the beam line&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; line = CalculateBeamLine( beam );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// Step 2: Set the new length of the rebar &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// based on new beam length. For this, we &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// can set the relevant parameter after &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// checking at UI&lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebar.get_Parameter( &lt;SPAN&gt;"B"&lt;/SPAN&gt; ).Set( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GetLength( line ) );
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;catch&lt;/SPAN&gt;( &lt;SPAN&gt;Exception&lt;/SPAN&gt; ex )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;TaskDialog&lt;/SPAN&gt;.Show( &lt;SPAN&gt;"Exception"&lt;/SPAN&gt;, ex.Message );
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;// Calculate the beam line &lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;private&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt; CalculateBeamLine( 
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;FamilyInstance&lt;/SPAN&gt; beam )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;GeometryElement&lt;/SPAN&gt; geoElement 
&amp;nbsp; &amp;nbsp; &amp;nbsp; = beam.get_Geometry( &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Options&lt;/SPAN&gt;() );
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; == geoElement 
&amp;nbsp; &amp;nbsp; &amp;nbsp; || 0 == geoElement.Objects.Size )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;throw&lt;/SPAN&gt; &lt;SPAN&gt;new&lt;/SPAN&gt; &lt;SPAN&gt;Exception&lt;/SPAN&gt;( 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;"Can't get the geometry of selected element."&lt;/SPAN&gt; );
&amp;nbsp; &amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;Line&lt;/SPAN&gt; beamLine = &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;foreach&lt;/SPAN&gt;( &lt;SPAN&gt;GeometryObject&lt;/SPAN&gt; geoObject 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;in&lt;/SPAN&gt; geoElement.Objects )
&amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;// get the driving path and vector of the beam &lt;/SPAN&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; beamLine = geoObject &lt;SPAN&gt;as&lt;/SPAN&gt; &lt;SPAN&gt;Line&lt;/SPAN&gt;;
&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;if&lt;/SPAN&gt;( &lt;SPAN&gt;null&lt;/SPAN&gt; != beamLine )
&amp;nbsp; &amp;nbsp; &amp;nbsp; {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; beamLine;
&amp;nbsp; &amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; }
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;null&lt;/SPAN&gt;;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the length of the given line&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;static&lt;/SPAN&gt; &lt;SPAN&gt;double&lt;/SPAN&gt; GetLength( &lt;SPAN&gt;Line&lt;/SPAN&gt; line )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;XYZ&lt;/SPAN&gt; v = line.get_EndPoint( 1 ) - line.get_EndPoint( 0 );
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; v.GetLength();
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the auxiliary string&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; GetAdditionalInformation()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"Automatically align rebar to match beam"&lt;/SPAN&gt;;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Set the priority&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;ChangePriority&lt;/SPAN&gt; GetChangePriority()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;ChangePriority&lt;/SPAN&gt;.Rebar;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the updater Id&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;UpdaterId&lt;/SPAN&gt; GetUpdaterId()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; updaterID;
&amp;nbsp; }
&amp;nbsp;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt;&lt;SPAN&gt; Return the updater name&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;///&lt;/SPAN&gt; &lt;SPAN&gt;&amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; GetUpdaterName()
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;"Rebar alignment updater"&lt;/SPAN&gt;;
&amp;nbsp; }
}
&amp;nbsp;
[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.ReadOnly )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;UIDynamicModelUpdateOff&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalCommand&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; Execute(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ExternalCommandData&lt;/SPAN&gt; commandData,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ref&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; message,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementSet&lt;/SPAN&gt; elements )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;.m_updateActive = &lt;SPAN&gt;false&lt;/SPAN&gt;;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
}
&amp;nbsp;
[&lt;SPAN&gt;Transaction&lt;/SPAN&gt;( &lt;SPAN&gt;TransactionMode&lt;/SPAN&gt;.ReadOnly )]
[&lt;SPAN&gt;Regeneration&lt;/SPAN&gt;( &lt;SPAN&gt;RegenerationOption&lt;/SPAN&gt;.Manual )]
&lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;class&lt;/SPAN&gt; &lt;SPAN&gt;UIDynamicModelUpdateOn&lt;/SPAN&gt; : &lt;SPAN&gt;IExternalCommand&lt;/SPAN&gt;
{
&amp;nbsp; &lt;SPAN&gt;public&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt; Execute(
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ExternalCommandData&lt;/SPAN&gt; commandData,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ref&lt;/SPAN&gt; &lt;SPAN&gt;string&lt;/SPAN&gt; message,
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;ElementSet&lt;/SPAN&gt; elements )
&amp;nbsp; {
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;RebarUpdater&lt;/SPAN&gt;.m_updateActive = &lt;SPAN&gt;true&lt;/SPAN&gt;;
&amp;nbsp; &amp;nbsp; &lt;SPAN&gt;return&lt;/SPAN&gt; &lt;SPAN&gt;Result&lt;/SPAN&gt;.Succeeded;
&amp;nbsp; }
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 02 Apr 2016 11:03:19 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/revit-api-forum/elements-event/m-p/6247842#M66592</guid>
      <dc:creator>Anonymous</dc:creator>
      <dc:date>2016-04-02T11:03:19Z</dc:date>
    </item>
  </channel>
</rss>

