コード例 #1
0
        public void Stream(Type type)
        {
            var part = _elem as Part;

            if (type == typeof(Element) && _elem is Element element)
            {
                _data.Add(new MemberSeparatorWithOffset(nameof(PartUtils)));
                _data.Add(new Bool(nameof(PartUtils.AreElementsValidForCreateParts), PartUtils.AreElementsValidForCreateParts(element.Document, new[] { element.Id })));
                _data.Add(new Object(nameof(PartUtils.GetAssociatedPartMaker), PartUtils.GetAssociatedPartMaker(element.Document, element.Id)));
                _data.Add(new Bool(nameof(PartUtils.HasAssociatedParts), PartUtils.HasAssociatedParts(element.Document, element.Id)));
                _data.Add(new Bool(nameof(PartUtils.IsValidForCreateParts), PartUtils.IsValidForCreateParts(element.Document, new LinkElementId(element.Id))));
            }

            if (type == typeof(Part) && part != null)
            {
                _data.Add(new MemberSeparatorWithOffset(nameof(PartUtils)));
                _data.Add(new Bool(nameof(PartUtils.ArePartsValidForDivide), PartUtils.ArePartsValidForDivide(part.Document, new[] { part.Id })));
                _data.Add(new Bool(nameof(PartUtils.ArePartsValidForMerge), PartUtils.ArePartsValidForMerge(part.Document, new[] { part.Id })));
                _data.Add(new Int(nameof(PartUtils.GetChainLengthToOriginal), PartUtils.GetChainLengthToOriginal(part)));
                var isMergedPart = PartUtils.IsMergedPart(part);
                _data.Add(new Enumerable(nameof(PartUtils.GetMergedParts), isMergedPart ? PartUtils.GetMergedParts(part) : Array.Empty <ElementId>(), part.Document));
                _data.Add(new Bool(nameof(PartUtils.IsMergedPart), isMergedPart));
                _data.Add(new Bool(nameof(PartUtils.IsPartDerivedFromLink), PartUtils.IsPartDerivedFromLink(part)));

                _data.Add(new MemberSeparatorWithOffset(nameof(Part)));
                _data.Add(new String(nameof(Part.OriginalCategoryId), ((BuiltInCategory)part.OriginalCategoryId.IntegerValue).ToString()));

                var sourceElementIds = part.GetSourceElementIds().Where(e => e.HostElementId != ElementId.InvalidElementId).Select(e => e.HostElementId).ToList();
                _data.Add(new Enumerable(nameof(Part.GetSourceElementIds), sourceElementIds, part.Document));

                var sourceCategoryIds = part.GetSourceElementOriginalCategoryIds().Select(e => (BuiltInCategory)e.IntegerValue).ToList();
                _data.Add(new EnumerableAsString(nameof(Part.GetSourceElementOriginalCategoryIds), sourceCategoryIds));
            }
        }
コード例 #2
0
        /// <summary>
        ///     Divide part list for element.
        /// </summary>
        /// <param name="elm"></param>
        /// <param name="origin"></param>
        /// <param name="baseX"></param>
        /// <param name="step"></param>
        /// <param name="initAngle"></param>
        /// <param name="radius"></param>
        public static void DividePartList(this Element elm, XYZ origin, XYZ baseX, double[] step, TextureAngle initAngle, double radius = 5000)
        {
            if (elm is null)
            {
                throw new ArgumentNullException(nameof(elm));
            }

            if (origin is null)
            {
                throw new ArgumentNullException(nameof(origin));
            }

            if (baseX is null)
            {
                throw new ArgumentNullException(nameof(baseX));
            }

            if (step[0] < 0)
            {
                throw new ArgumentException(nameof(step));
            }

            if (step[1] < 0)
            {
                throw new ArgumentException(nameof(step));
            }

            if (radius < 0)
            {
                throw new ArgumentException(nameof(radius));
            }

            if (initAngle == Rotation90 || initAngle == Rotation270)
            {
                step = new[] { step[1], step[0] }
            }
            ;

            var plane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, origin);
            var baseY = plane.Normal.CrossProduct(baseX);
            var lines = new List <Curve>();

            var xAxis = Line.CreateBound(origin - radius * baseX, origin + radius * baseX);
            var yAxis = Line.CreateBound(origin - radius * baseY, origin + radius * baseY);

            lines.Add(xAxis);
            lines.Add(yAxis);

            var yp0 = yAxis.GetEndPoint(0);
            var yp1 = yAxis.GetEndPoint(1);

            var xNum = Convert.ToInt32(Math.Ceiling(radius / step[0]));
            var yNum = Convert.ToInt32(Math.Ceiling(radius / step[1]));

            // Draws lines on x direction
            for (var i = 0; i < xNum; i++)
            {
                var offset = (i + 1) * step[0] * baseX;

                // On Right.
                lines.Add(Line.CreateBound(yp0 + offset, yp1 + offset));

                // On Left.
                lines.Add(Line.CreateBound(yp0 - offset, yp1 - offset));
            }

            var xp0 = xAxis.GetEndPoint(0);
            var xp1 = xAxis.GetEndPoint(1);

            // Draws lines on y direction
            for (var i = 0; i < yNum; i++)
            {
                var offset = (i + 1) * step[1] * baseY;

                // Above.
                lines.Add(Line.CreateBound(xp0 + offset, xp1 + offset));

                // Below.
                lines.Add(Line.CreateBound(xp0 - offset, xp1 - offset));
            }

            var doc         = elm.Document;
            var sketchPlane = SketchPlane.Create(doc, plane);
            var ids         = PartUtils.GetAssociatedParts(doc, elm.Id, true, false).ToList();

            if (ids.Count > 0)
            {
                var partMaker = PartUtils.GetAssociatedPartMaker(doc, ids[0]);

                doc.Delete(partMaker.Id);
            }

            ids = PartUtils.GetAssociatedParts(doc, elm.Id, true, true).ToList();

            if (ids.Count <= 0)
            {
                PartUtils.CreateParts(doc, new List <ElementId> {
                    elm.Id
                });

                doc.Regenerate();

                ids = PartUtils.GetAssociatedParts(doc, elm.Id, true, true).ToList();
            }

            if (ids.Count == 1)
            {
                PartUtils.DivideParts(doc, ids, new List <ElementId>(), lines, sketchPlane.Id);
            }
        }
コード例 #3
0
        /// <summary>
        ///     Divides part list for wall.
        /// </summary>
        /// <param name="wall"></param>
        /// <param name="step"></param>
        /// <param name="materialNames"></param>
        /// <param name="lineHeight"></param>
        /// <param name="isHorizontal"></param>
        /// <param name="eps"></param>
        public static void DividePartList(this Wall wall, double[] step, string[] materialNames, double lineHeight, bool isHorizontal = true, double eps = 1e-3)
        {
            if (wall is null)
            {
                throw new ArgumentNullException(nameof(wall));
            }

            if (step is null)
            {
                throw new ArgumentNullException(nameof(step));
            }

            if (materialNames is null)
            {
                throw new ArgumentNullException(nameof(materialNames));
            }

            var line  = (wall.Location as LocationCurve)?.Curve as Line;
            var lines = new List <Curve>();

            if (isHorizontal)
            {
                var p0 = line.GetEndPoint(0);
                var p1 = line.GetEndPoint(1);

                lines.Add(Line.CreateBound(p0, p1));

                for (var i = 0; i < step.Length; i++)
                {
                    var sum     = step.Take(i + 1).Sum();
                    var tmpP0   = new XYZ(p0.X, p0.Y, p0.Z + sum);
                    var tmpP1   = new XYZ(p1.X, p1.Y, p1.Z + sum);
                    var tmpLine = Line.CreateBound(tmpP0, tmpP1);

                    lines.Add(tmpLine);
                }
            }

            else
            {
                var p0 = line.GetEndPoint(0);
                var p1 = new XYZ(p0.X, p0.Y, lineHeight);

                lines.Add(Line.CreateBound(p0, p1));

                for (var i = 0; i < step.Length; i++)
                {
                    var sum = step.Take(i + 1).Sum();

                    var tmpP0   = p0 + sum * line.Direction;
                    var tmpP1   = p1 + sum * line.Direction;
                    var tmpLine = Line.CreateBound(tmpP0, tmpP1);

                    lines.Add(tmpLine);
                }
            }

            var opt = new Options {
                ComputeReferences = true, DetailLevel = ViewDetailLevel.Coarse
            };
            var ge    = wall.get_Geometry(opt);
            var solid = ge.FirstOrDefault(f => f is Solid) as Solid;

            if (solid != null)
            {
                var faces = solid.Faces.Cast <Face>().Where(w => w is PlanarFace).Cast <PlanarFace>().ToList();
                var face  = faces.FirstOrDefault(f => f.FaceNormal.AngleTo(wall.Orientation) < eps);
                var doc   = wall.Document;
                var plane = SketchPlane.Create(doc, face.Reference);
                var ids   = PartUtils.GetAssociatedParts(doc, wall.Id, true, false).ToList();

                if (ids.Count > 0)
                {
                    var partMaker = PartUtils.GetAssociatedPartMaker(doc, ids[0]);

                    doc.Delete(partMaker.Id);
                }

                ids = PartUtils.GetAssociatedParts(doc, wall.Id, true, true).ToList();

                if (ids.Count <= 0)
                {
                    PartUtils.CreateParts(doc, new List <ElementId> {
                        wall.Id
                    });

                    doc.Regenerate();
                    ids = PartUtils.GetAssociatedParts(doc, wall.Id, true, true).ToList();
                }

                if (ids.Count == 1)
                {
                    PartUtils.DivideParts(doc, ids, new List <ElementId>(), lines, plane.Id);
                }

                var materials = doc.GetInstanceList <Material>();

                for (var i = 0; i < ids.Count; i++)
                {
                    var part = doc.GetElement(ids[i]) as Part;

                    if (part != null)
                    {
                        var parm = part.get_Parameter(BuiltInParameter.DPART_MATERIAL_BY_ORIGINAL);

                        parm.Set(0);
                    }

                    var materialParm = part.get_Parameter(BuiltInParameter.DPART_MATERIAL_ID_PARAM);
                    var materialId   = materials.FirstOrDefault(f => f.Name == materialNames[i])?.Id;

                    materialParm.Set(materialId);
                }
            }
        }