• Revit二次开发——创建墙


    创建墙测试

      1 using Autodesk.Revit.UI;
      2 using System;
      3 using System.Collections.Generic;
      4 using System.Linq;
      5 using System.Text;
      6 using System.Threading.Tasks;
      7 using Autodesk.Revit.DB;
      8 using System.Windows.Forms;
      9 using Autodesk.Revit.Attributes;
     10 using MapTools;
     11 using System.Runtime.InteropServices;
     12 using XBIMApp;
     13 using Autodesk.Revit.UI.Selection;
     14 using Autodesk.Revit.ApplicationServices;
     15 namespace AxBIMTest
     16 {
     17     [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
     18     [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
     19 
     20     public class AxWallCreate : IExternalCommand
     21     {
     22         Autodesk.Revit.ApplicationServices.Application app;
     23         Autodesk.Revit.DB.Document doc;
     24         List<AxWallLine> m_WallPolylines = null;
     25         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
     26         {
     27             UIApplication uiApp = commandData.Application;
     28             UIDocument uiDoc = uiApp.ActiveUIDocument;
     29             app = uiApp.Application;
     30             doc = uiDoc.Document;
     31             Selection selection = uiDoc.Selection;
     32             OpenFileDialog dlg = new OpenFileDialog();
     33             dlg.Title = "打开墙线文件";
     34             dlg.Filter = "(*.shp)|*.shp";
     35             if (dlg.ShowDialog() == DialogResult.OK && dlg.FileName != String.Empty)
     36             {
     37                 String wallFileName = dlg.FileName;
     38                 MessageBox.Show(wallFileName);
     39                 ReadWallLinesSHP(wallFileName);
     40                 String info = "读取线的数目:" + m_WallPolylines.Count;
     41 
     42                 MessageBox.Show(info, "信息");              
     43                 CreateWall();
     44             }
     45 
     46             return Result.Succeeded;
     47         }
     48 
     49         //读取墙线文件
     50         private void ReadWallLinesSHP(string FILENAME)
     51         {
     52             IntPtr hShp;
     53             hShp = ShapeLib.SHPOpen(FILENAME, "rb+");
     54             m_WallPolylines = new List<AxWallLine>();
     55             // get shape info and verify shapes were created correctly
     56             double[] minB = new double[4];
     57             double[] maxB = new double[4];
     58             int nEntities = 0;
     59             ShapeLib.ShapeType shapeType = 0;
     60             ShapeLib.SHPGetInfo(hShp, ref nEntities, ref shapeType, minB, maxB);
     61             double m_MinX = minB[0];
     62             double m_MinY = minB[1];
     63             for (int i = 0; i < nEntities; i++)
     64             {
     65                 int iShape = i;
     66                 IntPtr pshpObj = ShapeLib.SHPReadObject(hShp, iShape);
     67                 AxPolyline2d plline = new AxPolyline2d();
     68                 ShapeLib.SHPObject shpObj = new ShapeLib.SHPObject();
     69                 Marshal.PtrToStructure(pshpObj, shpObj);
     70 
     71                 int parts = shpObj.nParts;
     72                 if (parts > 0)
     73                 {
     74                     int[] partStart = new int[parts];
     75                     Marshal.Copy(shpObj.paPartStart, partStart, 0, parts);
     76                     int[] partType = new int[parts];
     77                     Marshal.Copy(shpObj.paPartType, partType, 0, parts);
     78 
     79                     int number = shpObj.nVertices;
     80                     double[] m_padfX = new double[number];
     81                     Marshal.Copy(shpObj.padfX, m_padfX, 0, number);
     82                     double[] m_padfY = new double[number];
     83                     Marshal.Copy(shpObj.padfY, m_padfY, 0, number);
     84                     for (int iv = 0; iv < number; iv++)
     85                     {
     86                         double x = m_padfX[iv];
     87                         double y = m_padfY[iv];
     88                         x = x - minB[0];
     89                         y = y - minB[1];
     90                         Vector2d pt = new Vector2d(x * 1000, y * 1000);
     91                         plline.polyline.Add(pt);//
     92                     }
     93                     AxWallLine wall = new AxWallLine();
     94                     wall.WallId = 1000 + i;
     95                     wall.m_Polyline = plline;
     96                     wall.m_MaxZ = 3000;
     97                     wall.m_MinZ = 0;
     98                     wall.m_Thickness = 150;
     99                     m_WallPolylines.Add(wall);
    100                 }
    101                 ShapeLib.SHPDestroyObject(pshpObj);
    102             }
    103             ShapeLib.SHPClose(hShp);
    104         }
    105 
    106         public void CreateWall()
    107         {
    108             List<IList<Curve>> m_curves = new List<IList<Curve>>(); ;
    109             for (int i = 0; i < m_WallPolylines.Count; i++)
    110             {
    111                 IList<Curve> curves = new List<Curve>();
    112                 AxWallLine wall = m_WallPolylines[i];
    113                 List<Vector2d> segments = wall.m_Polyline.polyline;
    114                 for (int j = 0; j < segments.Count - 1; j++)
    115                 {
    116                     Vector2d segment0 = segments[j];
    117                     Vector2d segment1 = segments[j + 1];
    118                     XYZ pt0 = new XYZ(segment0.X, segment0.Y, 0);
    119                     XYZ pt00 = new XYZ(segment0.X, segment0.Y, 50);
    120                     XYZ pt1 = new XYZ(segment1.X, segment1.Y, 0);
    121                     XYZ pt11 = new XYZ(segment1.X, segment1.Y, 50);
    122                     Line line01 = Line.CreateBound(pt0, pt1);
    123                     Line line11 = Line.CreateBound(pt1, pt11);
    124                     Line line10 = Line.CreateBound(pt11, pt00);
    125                     Line line00 = Line.CreateBound(pt00, pt0);
    126                     curves.Add(line01);
    127                     curves.Add(line11);
    128                     curves.Add(line10);
    129                     curves.Add(line00);
    130                 }
    131                 m_curves.Add(curves);
    132             }
    133             using (Transaction ts = new Transaction(doc,"AxCreateWall"))
    134             {
    135                 ts.Start();
    136                 for (int i = 0; i < m_curves.Count; i++)
    137                 {
    138                     IList<Curve> curves_t = m_curves[i];
    139                     Wall.Create(doc, curves_t, false);
    140                 }
    141                
    142                 ts.Commit();
    143             }
    144           
    145         }
    146     }
    147 }
     [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
        [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
    
        public class AxWallCreate : IExternalCommand
        {
            Autodesk.Revit.ApplicationServices.Application app;
            Autodesk.Revit.DB.Document doc;
            List<AxWallLine> m_WallPolylines = null;
            public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
            {
                UIApplication uiApp = commandData.Application;
                UIDocument uiDoc = uiApp.ActiveUIDocument;
                app = uiApp.Application;
                doc = uiDoc.Document;
                Selection selection = uiDoc.Selection;
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.Title = "打开墙线文件";
                dlg.Filter = "(*.shp)|*.shp";
                if (dlg.ShowDialog() == DialogResult.OK && dlg.FileName != String.Empty)
                {
                    String wallFileName = dlg.FileName;
                    MessageBox.Show(wallFileName);
                    ReadWallLinesSHP(wallFileName);
                    String info = "读取线的数目:" + m_WallPolylines.Count;
    
                    MessageBox.Show(info, "信息");              
                    CreateWall();
                }
    
                return Result.Succeeded;
            }
    
            //读取墙线文件
            private void ReadWallLinesSHP(string FILENAME)
            {
                IntPtr hShp;
                hShp = ShapeLib.SHPOpen(FILENAME, "rb+");
                m_WallPolylines = new List<AxWallLine>();
                // get shape info and verify shapes were created correctly
                double[] minB = new double[4];
                double[] maxB = new double[4];
                int nEntities = 0;
                ShapeLib.ShapeType shapeType = 0;
                ShapeLib.SHPGetInfo(hShp, ref nEntities, ref shapeType, minB, maxB);
                double m_MinX = minB[0];
                double m_MinY = minB[1];
                for (int i = 0; i < nEntities; i++)
                {
                    int iShape = i;
                    IntPtr pshpObj = ShapeLib.SHPReadObject(hShp, iShape);
                    AxPolyline2d plline = new AxPolyline2d();
                    ShapeLib.SHPObject shpObj = new ShapeLib.SHPObject();
                    Marshal.PtrToStructure(pshpObj, shpObj);
    
                    int parts = shpObj.nParts;
                    if (parts > 0)
                    {
                        int[] partStart = new int[parts];
                        Marshal.Copy(shpObj.paPartStart, partStart, 0, parts);
                        int[] partType = new int[parts];
                        Marshal.Copy(shpObj.paPartType, partType, 0, parts);
    
                        int number = shpObj.nVertices;
                        double[] m_padfX = new double[number];
                        Marshal.Copy(shpObj.padfX, m_padfX, 0, number);
                        double[] m_padfY = new double[number];
                        Marshal.Copy(shpObj.padfY, m_padfY, 0, number);
                        for (int iv = 0; iv < number; iv++)
                        {
                            double x = m_padfX[iv];
                            double y = m_padfY[iv];
                            x = x - minB[0];
                            y = y - minB[1];
                            Vector2d pt = new Vector2d(x * 1000, y * 1000);
                            plline.polyline.Add(pt);//
                        }
                        AxWallLine wall = new AxWallLine();
                        wall.WallId = 1000 + i;
                        wall.m_Polyline = plline;
                        wall.m_MaxZ = 3000;
                        wall.m_MinZ = 0;
                        wall.m_Thickness = 150;
                        m_WallPolylines.Add(wall);
                    }
                    ShapeLib.SHPDestroyObject(pshpObj);
                }
                ShapeLib.SHPClose(hShp);
            }
    
            public void CreateWall()
            {
                //List<Curve>;
                IList<Curve> curves = new List<Curve>();
                Line l1 = Line.CreateBound(XYZ.Zero, new XYZ(150, 0, 0));
                Line l2 = Line.CreateBound(XYZ.Zero, new XYZ(50, 0, 50));
                Line l3 = Line.CreateBound(new XYZ(50, 0, 50), new XYZ(100, 0, 50));
                Line l4 = Line.CreateBound(new XYZ(100, 0, 50), new XYZ(150, 0, 0));
                curves.Add(l1);
                curves.Add(l2);
                curves.Add(l3);
                curves.Add(l4);
    
                using (Transaction ts = new Transaction(doc,"AxCreateWall"))
                {
                    ts.Start();
                    Wall.Create(doc, curves, false);
                    ts.Commit();
                }
    
                for (int i = 0; i < m_WallPolylines.Count; i++)
                {
                    AxWallLine wall = m_WallPolylines[i];
                    List<Vector2d> segments = wall.m_Polyline.polyline;
                    for (int j = 0; j < segments.Count-1; j++)
                    {
                        Vector2d segment0 = segments[j];
                        Vector2d segment1 = segments[j+1];
                        XYZ pt0 = new XYZ(segment0.X, segment0.Y, 0);
                        XYZ pt1 = new XYZ(segment1.X, segment1.Y, 0);
                        Line line = Line.CreateBound(pt0, pt1);
    
                        //Wall.Create(doc, line, true);
                    }            
                }
            }
        }
    

      

  • 相关阅读:
    Qt(python) + 百度语音合成 实现demo
    windows7 + Qt(MSVC2017) + VS2019安装配置
    ubuntu下openCV-Haar特征分类器训练
    坚果云+typora(个人十分喜欢的一个记笔记方式)
    文本编辑--程序员专属技能
    ftp、tftp、nfs--服务器搭建
    QT--动态人流量监测系统
    C++ --内存四区概述
    CTFHUB-技能树-Web-信息泄露
    网络教育行业频发奖金高薪挖人,在线教育行业将迎来快速发展
  • 原文地址:https://www.cnblogs.com/yhlx125/p/16664964.html
Copyright © 2020-2023  润新知