Revit二次开发——立管转换


      [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.UsingCommandData)]

    class Cmd_VerticalPipeConvert : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection sel = uidoc.Selection;

            View acview = uidoc.ActiveView;
            //UIView acuivew = uidoc.Activeuiview();

            var pipetype = doc.TCollector<PipeType>().First();
            var pipesystype = doc.TCollector<PipingSystemType>().First();
            var level = acview.GenLevel;
            var bottomele = level.Elevation;
            var topele = bottomele + 4000d / 304.8;
             
            var georef = sel.PickObject(ObjectType.PointOnElement);
            var cadlinkinstance = georef.GetElement(doc) as Instance;
            var cadgeometry = cadlinkinstance.get_Geometry(new Options());
            var cadGraphicStyle = cadgeometry.GraphicsStyleId.GetElement(doc);
            var transform = cadlinkinstance.GetTransform();
            var geomery = cadlinkinstance.GetGeometryObjectFromReference(georef);
             
            var gs = geomery.GraphicsStyleId.GetElement(doc) as GraphicsStyle;
            var gsc = gs.GraphicsStyleCategory;
            var layername = gsc.Name;
            MessageBox.Show(layername);

            var geometry = cadlinkinstance.get_Geometry(new Options());
            var geometries = geometry.GetGeometries();
            var count = 0;
            try
            {
                count = 0;
                foreach (GeometryObject geoobj in geometries)
                {
                     
                    var geoins = geoobj as GeometryInstance;
                    var symbolgeometry = geoins.GetSymbolGeometry();
                    var geoenu = symbolgeometry.GetEnumerator();
                  
                    geoenu.Reset();
                    while (geoenu.MoveNext())
                    {
                        if (count > 10) break;
                        var obj = geoenu.Current;
                        var arcgs = obj.GraphicsStyleId.GetElement(doc) as GraphicsStyle;
                        var arcgsName = arcgs.GraphicsStyleCategory.Name;

                        //if (arcgsName == layername)
                            //MessageBox.Show(arcgsName);

                        if (obj is Arc)
                        {

                            //MessageBox.Show("find arc");
                            var arc = obj as Arc;
                            var arccenter = arc.Center;
                            var line = Line.CreateBound(arc.Center, arc.Center + 10 * XYZ.BasisZ);
                            line = line.CreateTransformed(transform) as Line;
                            //doc.NewLine(line);

                            arccenter = transform. OfPoint(arccenter);
                            //doc.NewLine(line);
                            var startpo = new XYZ(arccenter.X, arccenter.Y, bottomele);
                            var endpo = new XYZ(arccenter.X, arccenter.Y, topele);
                            if(arcgsName==layername)
                            doc.Invoke(m => { Pipe.Create(doc, pipesystype.Id, pipetype.Id, level.Id, startpo, endpo); }, "创建立管");
                            //count++;
                        }
                        else if (obj is Ellipse)
                        {
                            
                            //count++;
                            var arc = obj as Ellipse;
                            var line = Line.CreateBound(arc.Center, arc.Center + 10 * XYZ.BasisZ);
                            line = line.CreateTransformed(transform) as Line;
                            doc.NewLine(line);
                        }
                        else if (obj is GeometryInstance)
                        {
                             
                            var geoinstance1 = obj as GeometryInstance;
                            var transform1 = geoinstance1.Transform;
                            var geometrysmbol = (geoinstance1).SymbolGeometry;
                            var enu1 = geometrysmbol.GetEnumerator();
                            var gs1 = obj.GraphicsStyleId.GetElement(doc) as GraphicsStyle;
                            var gs1Name = gs1.GraphicsStyleCategory.Name;

                            while (enu1.MoveNext())
                            {
                                var obj1 = enu1.Current;
                                if (obj1 is Arc)
                                {
                                    var arc = obj1 as Arc;
                                    var arccenter = arc.Center;
                                    var line = Line.CreateBound(arccenter, arccenter + 10 * XYZ.BasisZ);
                                    line = line.CreateTransformed(transform.Multiply(transform1)) as Line;
                                    arccenter = transform.Multiply(transform1).OfPoint(arccenter);
                                    //doc.NewLine(line);
                                    var startpo = new XYZ(arccenter.X, arccenter.Y, bottomele);
                                    var endpo = new XYZ(arccenter.X, arccenter.Y, topele);
                                    if (arcgsName == layername)
                                        doc.Invoke(m => { Pipe.Create(doc, pipesystype.Id, pipetype.Id, level.Id, startpo, endpo); },"创建立管");
                                }
                                else if(obj1 is Ellipse)
                                {
                                    var arc = obj1 as Ellipse;
                                    if (arc == null) continue;
                                    var line = Line.CreateBound(arc.Center, arc.Center + 10 * XYZ.BasisZ);
                                    line = line.CreateTransformed(transform.Multiply(transform1)) as Line;
                                    //doc.NewLine(line);
                                }
                            }
                        }

                        //count++;
                    }
                    count++;
                }
 
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                //throw;
            }
            return Result.Succeeded;
        }
    }

 

 识别cad图纸上的立管 和立管图层,遍历所有的cad图元,取得表示立管的图元。
将立管图元转化为相应系统的管道。
本例用鼠标点选消防立管,程序将根据拾取的消防立管的图层 来 辨别立管。
立管高度暂时按照本楼层标高+4000mm 来设置。
本例中仅在平面图中正确运行。
本例中仅对图纸中的一重套嵌块做处理,多重套嵌块须自行做递归处理
本方法对导入cad图纸和连接cad图纸都有效

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值