//*****************************CreateSectionPerpendicular()***************************** public void CreateSectionPerpendicular(Document doc, UIDocument uidoc) { // My library LibraryGetItems libGet = new LibraryGetItems(); Element e = libGet.SelectElement(uidoc, doc); Wall wall = null; if (e != null) { wall = e as Wall; } LocationCurve lc = wall.Location as LocationCurve; Transform curveTransform = lc.Curve.ComputeDerivatives(0.5, true); // The transform contains the location curve // mid-point and tangent, and we can obtain // its normal in the XY plane: XYZ origin = curveTransform.Origin; XYZ viewdir = curveTransform.BasisX.Normalize(); XYZ up = XYZ.BasisZ; XYZ right = up.CrossProduct(viewdir); // Set up view transform, assuming wall's "up" // is vertical. For a non-vertical situation // such as section through a sloped floor, the // surface normal would be needed Transform transform = Transform.Identity; transform.Origin = origin; transform.BasisX = right; transform.BasisY = up; transform.BasisZ = viewdir; BoundingBoxXYZ sectionBox = new BoundingBoxXYZ(); sectionBox.Transform = transform; // Min & Max X values define the section // line length on each side of the wall. // Max Y is the height of the section box. // Max Z (5) is the far clip offset. double d = wall.WallType.Width; BoundingBoxXYZ bb = wall.get_BoundingBox(null); double minZ = bb.Min.Z; double maxZ = bb.Max.Z; double h = maxZ - minZ; // Z value offset from the current level in view. Level level = doc.ActiveView.GenLevel; double top = 90 - level.Elevation; double bottom = -(level.Elevation + 25); sectionBox.Min = new XYZ(-2 * d, bottom, 0); sectionBox.Max = new XYZ(2 * d, top, 5); ViewFamilyType vft = viewFamilyType(doc); View viewTemplate = libGet.GetViewTemplate(doc, "Z-ELEV ARCH OFF"); ViewSection vs = null; //Create wall section view using (Transaction tx = new Transaction(doc)) { try { tx.Start("Create Section"); vs = ViewSection.CreateSection(doc, vft.Id, sectionBox); doc.Regenerate(); tx.Commit(); } catch { } } using (Transaction t = new Transaction(doc)) { try { t.Start("Apply Structural View Template"); vs.ViewTemplateId = viewTemplate.Id; vs.Scale = 24; t.Commit(); } catch { } } }
//*****************************CreateSectionStart()***************************** public void CreateSectionStart(Document doc, UIDocument uidoc) { // My library LibraryGetItems libGet = new LibraryGetItems(); Element e = libGet.SelectElement(uidoc, doc); Wall wall = null; if (e != null) { wall = e as Wall; } // Create a BoundingBoxXYZ instance centered on wall BoundingBoxXYZ bb = wall.get_BoundingBox(null); double minZ = bb.Min.Z; double maxZ = bb.Max.Z; double h = maxZ - minZ; Level level = doc.ActiveView.GenLevel; double top = 90 - level.Elevation; double bottom = -(level.Elevation + 25); LocationCurve lc = wall.Location as LocationCurve; Line line = lc.Curve as Line; XYZ p = line.GetEndPoint(0); XYZ q = line.GetEndPoint(1); XYZ v = p - q; // p point 0 - q point 1 - view direction up. double halfLength = v.GetLength() / 2; double offset = 3; // offset by 3 feet. //Max/Min X = Section line Length, Max/Min Y is the height of the section box, Max/Min Z far clip XYZ min = new XYZ(-halfLength, bottom, -offset); XYZ max = new XYZ(halfLength, top, offset); XYZ midpoint = q + 0.5 * v; // q get lower midpoint. XYZ walldir = v.Normalize(); XYZ up = XYZ.BasisZ; XYZ viewdir = walldir.CrossProduct(up); Transform t = Transform.Identity; t.Origin = midpoint; t.BasisX = walldir; t.BasisY = up; t.BasisZ = viewdir; BoundingBoxXYZ sectionBox = new BoundingBoxXYZ(); sectionBox.Transform = t; sectionBox.Min = min; // scope box start sectionBox.Max = max; // scope box end ViewFamilyType vft = viewFamilyType(doc); View viewTemplate = libGet.GetViewTemplate(doc, "Z-ELEV ARCH OFF"); ViewSection vs = null; //Create wall section view using (Transaction tx = new Transaction(doc)) { try { tx.Start("Create Section"); vs = ViewSection.CreateSection(doc, vft.Id, sectionBox); tx.Commit(); } catch { } } using (Transaction tr = new Transaction(doc)) { try { tr.Start("Apply Structural View Template"); vs.ViewTemplateId = viewTemplate.Id; vs.Scale = 24; tr.Commit(); } catch { } } }