public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication app = commandData.Application; UIDocument uidoc = app.ActiveUIDocument; Document doc = uidoc.Document; #region Determine true north rotation Element projectInfoElement = new FilteredElementCollector(doc) .OfCategory(BuiltInCategory.OST_ProjectBasePoint) .FirstElement(); BuiltInParameter bipAtn = BuiltInParameter.BASEPOINT_ANGLETON_PARAM; Parameter patn = projectInfoElement.get_Parameter( bipAtn); double atn = patn.AsDouble(); Debug.Print( "Angle to north from project info: {0}", Util.AngleString(atn)); #endregion // Determine true north rotation //ElementSet els = uidoc.Selection.Elements; // 2014 ICollection <ElementId> ids = uidoc.Selection.GetElementIds(); // 2015 if (1 != ids.Count) { message = "Please select a single element."; } else { //ElementSetIterator it = els.ForwardIterator(); //it.MoveNext(); //Element e = it.Current as Element; // 2014 Element e = doc.GetElement(ids.First()); // 2015 XYZ p; if (!Util.GetElementLocation(out p, e)) { message = "Selected element has no location defined."; Debug.Print(message); } else { string msg = "Selected element location: " + Util.PointString(p); XYZ pnp; double x, y, pna; foreach (ProjectLocation location in doc.ProjectLocations) { //ProjectPosition projectPosition // = location.get_ProjectPosition( XYZ.Zero ); // 2017 ProjectPosition projectPosition = location.GetProjectPosition(XYZ.Zero); // 2018 x = projectPosition.EastWest; y = projectPosition.NorthSouth; pnp = new XYZ(x, y, 0.0); pna = projectPosition.Angle; msg += "\nAngle between project north and true north: " + Util.AngleString(pna); // Transform tr = Transform.get_Rotation( XYZ.Zero, XYZ.BasisZ, pna ); // 2013 Transform tr = Transform.CreateRotation(XYZ.BasisZ, pna); // 2014 //Transform tt = Transform.get_Translation( pnp ); // 2013 Transform tt = Transform.CreateTranslation(pnp); // 2014 Transform t = tt.Multiply(tr); msg += "\nUnrotated element location: " + Util.PointString(tr.OfPoint(p)) + " " + Util.PointString(tt.OfPoint(p)) + " " + Util.PointString(t.OfPoint(p)); Util.InfoMsg(msg); } } } return(Result.Failed); }