Create Solid from crop view

Create Solid from crop view

kiencent94
Enthusiast Enthusiast
778 Views
2 Replies
Message 1 of 3

Create Solid from crop view

kiencent94
Enthusiast
Enthusiast

Hello everyone, i m trying to create a solid from crop view boundary and cut plan offset.

I project 4 lowest points of ActiveView 's Boudingbox onto a plane, then create solid from these 4 points and height parameter (cut plane offset).

Finally i transformed this solid to ActiveView.get_BoundingBox(null).Transform.

But it seem not to transform 

This is my code 

public static Autodesk.Revit.DB.Solid CreateCutPlaneSolid (this Autodesk.Revit.DB.View planView)
        {
            Autodesk.Revit.DB.BoundingBoxXYZ bbActiveView = planView.get_BoundingBox(null);
            Autodesk.Revit.DB.Plane planePlanView = planView.SketchPlane.GetPlane();
            Autodesk.Revit.DB.PlanViewRange viewRange = (planView as Autodesk.Revit.DB.ViewPlan).GetViewRange();
            double cutPlaneHeight = viewRange.GetOffset(Autodesk.Revit.DB.PlanViewPlane.CutPlane);

            Autodesk.Revit.DB.XYZ pt0 = new Autodesk.Revit.DB.XYZ(bbActiveView.Min.X, bbActiveView.Min.Y, bbActiveView.Min.Z);
            Autodesk.Revit.DB.XYZ pt1 = new Autodesk.Revit.DB.XYZ(bbActiveView.Max.X, bbActiveView.Min.Y, bbActiveView.Min.Z);
            Autodesk.Revit.DB.XYZ pt2 = new Autodesk.Revit.DB.XYZ(bbActiveView.Max.X, bbActiveView.Max.Y, bbActiveView.Min.Z);
            Autodesk.Revit.DB.XYZ pt3 = new Autodesk.Revit.DB.XYZ(bbActiveView.Min.X, bbActiveView.Max.Y, bbActiveView.Min.Z);

            Autodesk.Revit.DB.XYZ pt00 = PlaneUtil.ProjectOnto(planePlanView, pt0);
            Autodesk.Revit.DB.XYZ pt11 = PlaneUtil.ProjectOnto(planePlanView, pt1);
            Autodesk.Revit.DB.XYZ pt22 = PlaneUtil.ProjectOnto(planePlanView, pt2);
            Autodesk.Revit.DB.XYZ pt33 = PlaneUtil.ProjectOnto(planePlanView, pt3);

            Autodesk.Revit.DB.Line edge00 = Autodesk.Revit.DB.Line.CreateBound(pt00, pt11);
            Autodesk.Revit.DB.Line edge11 = Autodesk.Revit.DB.Line.CreateBound(pt11, pt22);
            Autodesk.Revit.DB.Line edge22 = Autodesk.Revit.DB.Line.CreateBound(pt22, pt33);
            Autodesk.Revit.DB.Line edge33 = Autodesk.Revit.DB.Line.CreateBound(pt33, pt00);

            List<Autodesk.Revit.DB.Curve> edges0 = new List<Autodesk.Revit.DB.Curve>();
            edges0.Add(edge00);
            edges0.Add(edge11);
            edges0.Add(edge22);
            edges0.Add(edge33);

            Autodesk.Revit.DB.CurveLoop baseLoop0 = Autodesk.Revit.DB.CurveLoop.Create(edges0);
            List<Autodesk.Revit.DB.CurveLoop> loopList0 = new List<Autodesk.Revit.DB.CurveLoop>();
            loopList0.Add(baseLoop0);
            Autodesk.Revit.DB.Solid preTransformSolid = Autodesk.Revit.DB.GeometryCreationUtilities.CreateExtrusionGeometry(loopList0, Autodesk.Revit.DB.XYZ.BasisZ, cutPlaneHeight);
            Autodesk.Revit.DB.Solid transformSolid = Autodesk.Revit.DB.SolidUtils.CreateTransformed(preTransformSolid, bbActiveView.Transform);

            return transformSolid;
            //return preTransformSolid;

        }
var solidtest = activeView.CreateCutPlaneSolid();
            var bbSolidTest = solidtest.GetBoundingBox();
            Action<Document> differenceAction0 = ((x) =>
            {
                var translateSolid = solidtest.MoveToOrigin();
                FreeFormElement.Create(x, solidtest);
            });

            var solidFam0 = FamilyUtil.Create($"Solid{Guid.NewGuid()}", differenceAction0);
            solidFam0.Insert(bbSolidTest.Transform.Origin);

This is the result of code:

1.png

 

Sorry about my english if it s not clearly

 

Thanks very much,

Kien

0 Likes
Accepted solutions (1)
779 Views
2 Replies
Replies (2)
Message 2 of 3

TripleM-Dev.net
Advisor
Advisor
Accepted solution

Hi,

 

Use the view's CropBox. (CropBox Property)

Depending on the circumstances you will also need to evaluate the CropBoxActive, or even GetCropRegionShapeManager for shaped crops.

 

The Cropbox returns a BoundingBoxXYZ use this instead of the boundingbox's. (transform not needed)

I also think the boundingbox of the View could return more then just the CropBox (Annotation outside view)

 

For you're code, the TranslateSolid is never used?, not familiar with MoveToOrigin?

 

Good luck.

- Michel

 

ps.

What are you trying to accomplish with the solid, maybe show location of the view in 3D?

I've used something similar, but created a family which the app places with indicator of viewdirection etc in it.

0 Likes
Message 3 of 3

kiencent94
Enthusiast
Enthusiast

Thanks for you comments. I have resolved my problem. I want use the solid to achieve columns which in link document intersect with the solid.

I have another problems @@. I want to create dimension from faceside of column.

var dimType = revitData.DimensionTypes.ToList().FirstOrDefault();
            var ettColumnInView = new Model.Entity.Element { RevitElement = sel.PickObject(ObjectType.Element).GetRevitElement() };
            var faceEttColumninView = ettColumnInView.Faces;
            ReferenceArray yFaceRefArray = new ReferenceArray();
            foreach (PlanarFace item in faceEttColumninView.YFace)
            {
                yFaceRefArray.Append(item.Reference);                               
            }          
            var dimOriginYFace = ettColumnInView.Geometry.Origin + (ettColumnInView.Geometry.LengthY/2 
                + 200.0.milimeter2Feet()) * ettColumnInView.Geometry.BasisY;
            var dimLineYFace = Line.CreateBound(dimOriginYFace, dimOriginYFace + ettColumnInView.Geometry.BasisY);
            doc.Create.NewDimension(activeView, dimLineYFace, yFaceRefArray);
        public static Model.Entity.Face GetFaces ( this Model.Entity.Element ettElem)
        {
            var typeElem = ettElem.ElementType;
            var revitSolid = ettElem.RevitElement.GetSingleSolidValidRef();
            var faceElem = new Model.Entity.Face();            
            var activeView = revitData.ActiveView;
            for (int i = 0; i < revitSolid.Faces.Size; i++)
            {
                if (revitSolid.Faces.get_Item(i).ComputeNormal(Autodesk.Revit.DB.UV.Zero).IsXOrY() && !revitSolid.Faces.get_Item(i).ComputeNormal(Autodesk.Revit.DB.UV.Zero).IsParallelDirection(XYZ.BasisZ))
                {
                    faceElem.YFace.Add(revitSolid.Faces.get_Item(i) as Autodesk.Revit.DB.PlanarFace);
                }
                if (revitSolid.Faces.get_Item(i).ComputeNormal(Autodesk.Revit.DB.UV.Zero).IsXOrY() && !revitSolid.Faces.get_Item(i).ComputeNormal(Autodesk.Revit.DB.UV.Zero).IsParallelDirection(XYZ.BasisZ))
                {
                    faceElem.XFace.Add(revitSolid.Faces.get_Item(i) as Autodesk.Revit.DB.PlanarFace);
                }
            }
            return faceElem;

When i run this code, no dimension has been created, no error.

I checked face in ettColumnInView.Faces and it was right (i show faceEttColumninView.XFace.First().Area and i calculate it by myself in revit, two result are same)

0 Likes