完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
* 主體類型
* 企業(yè)名稱
* 信用代碼
* 所在行業(yè)
* 企業(yè)規(guī)模
* 所在職位
* 姓名
* 所在行業(yè)
* 學(xué)歷
* 工作性質(zhì)
請先選擇行業(yè)
您還可以選擇以下福利:
行業(yè)福利,領(lǐng)完即止!

下載app免費(fèi)領(lǐng)取會(huì)員

NULL

ad.jpg

Revit二次開發(fā)教程:Revit族參數(shù)可見性設(shè)置

發(fā)布于:2019-06-22 17:52:33

網(wǎng)友投稿

更多

很多人出于某種用途為族設(shè)置特殊的參數(shù)之后,希望可以將其隱藏。在Revit官方暴露出來的API中,是沒有方法來實(shí)現(xiàn)的。以下代碼演示了如何將墻體所有參數(shù)隱藏!

using System;

using System.Linq;

using Autodesk.Revit.UI;

using Autodesk.Revit.Attributes;

using Autodesk.Revit.DB;

using System.Reflection;


namespace RevitAPITest

{

    [Transaction(TransactionMode.Manual)]

    public class APITest : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)

        {

            var uiDoc = commandData.Application.ActiveUIDocument;

            var doc = uiDoc.Document;

            var elemIds = uiDoc.Selection.GetElementIds();


            if (elemIds.Count == 0)

            {

                TaskDialog.Show("Error", "Please select an element....!");

                return Result.Failed;

            }


            var elem = doc.GetElement(elemIds.First());


            //var eum = elem.Parameters.GetEnumerator();


            var elemType = doc.GetElement(elem.GetTypeId()) as ElementType;

            if (elemType == null)

            {

                return Result.Failed;

            }

            var eum = elemType.Parameters.GetEnumerator();


            while (eum.MoveNext())

            {

                var parameter = eum.Current as Parameter;

                parameter.SetVisibility(false);

            }

            return Result.Succeeded;

        }

    }


    public class NativeCore

    {

        public static bool InvokeMoudle(string mName, object[] paramters, bool apiMoudle = true)

        {

            try

            {

                MethodInfo m = null;

                if (apiMoudle)

                    m = NativeMoudle.GetAPIMoudlerMethod(mName);

                else

                    m = NativeMoudle.GetUIMoudlerMethod(mName);

                m.Invoke(null, paramters);

                return true;

            }

            catch (Exception ex)

            {

                return false;

            }

        }

    }


    public class NativeMoudle

    {

        /// 獲取RevitAPI程序集Moudle內(nèi)的方法名稱.

        /// <summary>

        /// 獲取RevitAPI程序集Moudle內(nèi)的方法名稱.

        /// </summary>

        /// <param name="name"></param>

        /// <returns></returns>

        public static MethodInfo GetAPIMoudlerMethod(string name)

        {

            var moudle = NativeMoudle.getAPIMoudle();

            var rs = moudle.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name);

            return rs.Count() == 0 ? null : rs.First();

        }


        /// 獲取RevitAPIUI程序集Moudle內(nèi)的方法名稱.

        /// <summary>

        /// 獲取RevitAPIUI程序集Moudle內(nèi)的方法名稱.

        /// </summary>

        /// <param name="name"></param>

        /// <returns></returns>

        public static MethodInfo GetUIMoudlerMethod(string name)

        {

            var moudle = NativeMoudle.getUIMoudle();

            var rs = moudle.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == name);

            return rs.Count() == 0 ? null : rs.First();

        }


        /// 獲取RevitAPI Modules.

        /// <summary>

        /// 獲取RevitAPI Modules.

        /// </summary>

        /// <returns></returns>

        internal static Module getAPIMoudle()

        {

            return typeof(Document).Assembly.Modules.First();

        }


        /// 獲取RevitAPIUI Modules.

        /// <summary>

        /// 獲取RevitAPIUI Modules.

        /// </summary>

        /// <returns></returns>

        internal static Module getUIMoudle()

        {

            return typeof(UIDocument).Assembly.Modules.First();

        }


    }


    public static class ParameterExtension

    {

        /// <summary>

        /// 設(shè)置參數(shù)對象對用戶是否可見.

        /// </summary>

        /// <param name="parameter"></param>

        /// <param name="visible"></param>

        /// <returns></returns>

        public static bool SetVisibility(this Parameter parameter, bool visible)

        {

            var parameterIntPtr = parameter.ToParamDef();

            if (parameterIntPtr == IntPtr.Zero)

            {

                return false;

            }


            var result = NativeCore.InvokeMoudle("ParamDef.setUserVisible", new object[] 

                {

                    parameterIntPtr, visible

                });


            return result;

        }


        /// <summary>

        /// 將參數(shù)對象轉(zhuǎn)為非托管指針.

        /// </summary>

        /// <param name="parameter"></param>

        /// <returns></returns>

        public static IntPtr ToParamDef(this Parameter parameter)

        {

            try

            {

                var m = typeof(Parameter).GetMethod("getParamDef", BindingFlags.NonPublic | BindingFlags.Instance);

                return ((Pointer)m.Invoke(parameter, null)).ToIntPtr();

            }

            catch

            {

                return IntPtr.Zero;

            }

        }

    }


    public static class PointerExtension

    {

        /// 將指針轉(zhuǎn)為句柄.

        /// <summary>

        /// 將指針轉(zhuǎn)為句柄.

        /// </summary>

        /// <param name="p"></param>

        /// <returns></returns>

        public unsafe static IntPtr ToIntPtr(this Pointer p)

        {

            return (IntPtr)p

                .GetType()

                .GetMethod("GetPointerValue", BindingFlags.NonPublic | BindingFlags.Instance)

                .Invoke(p, null);

        }

    }

}

圖片.png

圖片.png

本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

未標(biāo)題-1.jpg

上一篇:REVIT中如何把墻附著到樓梯底部?

下一篇:Revit二次開發(fā)教程:Revit API Hook 之 攔截鼠標(biāo)雙擊元素事件

60acb4e0ef112.png