Exemplo n.º 1
0
        public static Color4D ColorFromAssetDoubleArray4d(AssetPropertyDoubleArray4d prop)
        {
#if REVIT2019 || REVIT2020
            var colorValues = prop.GetValueAsDoubles()?.ToList() ?? new List <double>();
            if (colorValues != null && colorValues.Count > 3)
            {
                return(new Color4D(
                           (float)colorValues[0],
                           (float)colorValues[1],
                           (float)colorValues[2],
                           (float)colorValues[3]));
            }
            else
            {
                // Default return if invalid
                return(new Color4D(200));
            }
#else
            return(new Color4D(
                       (float)prop.Value.get_Item(0),
                       (float)prop.Value.get_Item(1),
                       (float)prop.Value.get_Item(2),
                       (float)prop.Value.get_Item(3)));
#endif
        }
            private static Tuple <Type, Object> GetTypeAndValue(AssetProperty assetProperty, int level)
            {
                Object theValue;
                Type   valueType;

                //For each AssetProperty, it has different type and value
                //must deal with it separately
                try
                {
                    if (assetProperty is AssetPropertyBoolean)
                    {
                        AssetPropertyBoolean property = assetProperty as AssetPropertyBoolean;
                        valueType = typeof(AssetPropertyBoolean);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyDistance)
                    {
                        AssetPropertyDistance property = assetProperty as AssetPropertyDistance;
                        valueType = typeof(AssetPropertyDistance);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyDouble)
                    {
                        AssetPropertyDouble property = assetProperty as AssetPropertyDouble;
                        valueType = typeof(AssetPropertyDouble);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyDoubleArray2d)
                    {
                        //Default, it is supported by PropertyGrid to display Double []
                        //Try to convert DoubleArray to Double []
                        AssetPropertyDoubleArray2d property = assetProperty as AssetPropertyDoubleArray2d;
                        valueType = typeof(AssetPropertyDoubleArray2d);
                        theValue  = GetSystemArrayAsString(property.Value);
                    }
                    else if (assetProperty is AssetPropertyDoubleArray3d)
                    {
                        AssetPropertyDoubleArray3d property = assetProperty as AssetPropertyDoubleArray3d;
                        valueType = typeof(AssetPropertyDoubleArray3d);
                        //theValue = GetSystemArrayAsString( property.Value ); // 2017
                        theValue = Util.DoubleArrayString(property.GetValueAsDoubles()); // 2018
                    }
                    else if (assetProperty is AssetPropertyDoubleArray4d)
                    {
                        AssetPropertyDoubleArray4d property = assetProperty as AssetPropertyDoubleArray4d;
                        valueType = typeof(AssetPropertyDoubleArray4d);
                        //theValue = GetSystemArrayAsString( property.Value ); // 2017
                        theValue = Util.DoubleArrayString(property.GetValueAsDoubles()); // 2018
                    }
                    else if (assetProperty is AssetPropertyDoubleMatrix44)
                    {
                        AssetPropertyDoubleMatrix44 property = assetProperty as AssetPropertyDoubleMatrix44;
                        valueType = typeof(AssetPropertyDoubleMatrix44);
                        theValue  = GetSystemArrayAsString(property.Value);
                    }
                    else if (assetProperty is AssetPropertyEnum)
                    {
                        AssetPropertyEnum property = assetProperty as AssetPropertyEnum;
                        valueType = typeof(AssetPropertyEnum);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyFloat)
                    {
                        AssetPropertyFloat property = assetProperty as AssetPropertyFloat;
                        valueType = typeof(AssetPropertyFloat);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyInteger)
                    {
                        AssetPropertyInteger property = assetProperty as AssetPropertyInteger;
                        valueType = typeof(AssetPropertyInteger);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyReference)
                    {
                        AssetPropertyReference property = assetProperty as AssetPropertyReference;
                        valueType = typeof(AssetPropertyReference);
                        theValue  = "REFERENCE"; //property.Type;
                    }
                    else if (assetProperty is AssetPropertyString)
                    {
                        AssetPropertyString property = assetProperty as AssetPropertyString;
                        valueType = typeof(AssetPropertyString);
                        theValue  = property.Value;
                    }
                    else if (assetProperty is AssetPropertyTime)
                    {
                        AssetPropertyTime property = assetProperty as AssetPropertyTime;
                        valueType = typeof(AssetPropertyTime);
                        theValue  = property.Value;
                    }
                    else
                    {
                        valueType = typeof(String);
                        theValue  = "Unprocessed asset type: " + assetProperty.GetType().Name;
                    }

                    if (assetProperty.NumberOfConnectedProperties > 0)
                    {
                        String result = "";
                        result = theValue.ToString();

                        TaskDialog.Show("Connected properties found", assetProperty.Name + ": " + assetProperty.NumberOfConnectedProperties);
                        IList <AssetProperty> properties = assetProperty.GetAllConnectedProperties();

                        foreach (AssetProperty property in properties)
                        {
                            if (property is Asset)
                            {
                                // Nested?
                                Asset asset = property as Asset;
                                int   size  = asset.Size;
                                for (int i = 0; i < size; i++)
                                {
                                    //AssetProperty subproperty = asset[i]; // 2018
                                    AssetProperty        subproperty  = asset.Get(i); // 2019
                                    Tuple <Type, Object> valueAndType = GetTypeAndValue(subproperty, level + 1);
                                    String indent = "";
                                    if (level > 0)
                                    {
                                        for (int iLevel = 1; iLevel <= level; iLevel++)
                                        {
                                            indent += "   ";
                                        }
                                    }
                                    result += "\n " + indent + "- connected: name: " + subproperty.Name + " | type: " + valueAndType.Item1.Name +
                                              " | value: " + valueAndType.Item2.ToString();
                                }
                            }
                        }

                        theValue = result;
                    }
                }
                catch
                {
                    return(null);
                }
                return(new Tuple <Type, Object>(valueType, theValue));
            }
Exemplo n.º 3
0
        /// <summary>
        /// 读取Asset中的各种属性
        /// </summary>
        /// <param name="prop"></param>
        /// <param name="ttrgb"></param>
        public void ReadAssetProperty(AssetProperty prop, string ttrgb)
        {
            switch (prop.Type)
            {
                 
#if R2016
            case AssetPropertyType.APT_Integer:
#elif R2018
            case AssetPropertyType.Integer:
#endif
                var AssetPropertyInt = prop as AssetPropertyInteger;
                break;

#if R2016
            case AssetPropertyType.APT_Distance:
#elif R2018
            case AssetPropertyType.Distance:
#endif
                var AssetPropertyDistance = prop as AssetPropertyDistance;
                break;

#if R2016
            case AssetPropertyType.APT_Double:
#elif R2018
            case AssetPropertyType.Double1:
#endif
                var AssetPropertyDouble = prop as AssetPropertyDouble;
                break;

#if R2016
            case AssetPropertyType.APT_DoubleArray2d:
#elif R2018
            case AssetPropertyType.Double2:
#endif
                var AssetPropertyDoubleArray2d = prop as AssetPropertyDoubleArray2d;
                break;

#if R2016
            case AssetPropertyType.APT_DoubleArray4d:
#elif R2018
            case AssetPropertyType.Double4:
#endif
                var AssetPropertyDoubleArray4d = prop as AssetPropertyDoubleArray4d;
                break;

#if R2016
            case AssetPropertyType.APT_String:
#elif R2018
            case AssetPropertyType.String:
#endif
                AssetPropertyString val = prop as AssetPropertyString;
                if (val.Name == "unifiedbitmap_Bitmap" && val.Value != "")
                {
                    map.Add(ttrgb);
                    map.Add(val.Value.Trim().Replace("\\", ""));
                }

                break;

#if R2016
            case AssetPropertyType.APT_Boolean:
#elif R2018
            case AssetPropertyType.Boolean:
#endif
                AssetPropertyBoolean boolProp = prop as AssetPropertyBoolean;
                break;

#if R2016
            case AssetPropertyType.APT_Double44:
#elif R2018
            case AssetPropertyType.Double44:
#endif
                AssetPropertyDoubleArray4d transformProp = prop as AssetPropertyDoubleArray4d;
#if R2016
                DoubleArray tranformValue = transformProp.Value;
#elif R2018
                DoubleArray tranformValue = (DoubleArray)transformProp.GetValueAsDoubles();
#endif
                break;

                //APT_Lis包含了一系列的子属性值
#if R2016
            case AssetPropertyType.APT_List:
#elif R2018
            case AssetPropertyType.List:
#endif
                AssetPropertyList     propList = prop as AssetPropertyList;
                IList <AssetProperty> subProps = propList.GetValue();
                if (subProps.Count == 0)
                {
                    break;
                }
                switch (subProps[0].Type)
                {
#if R2016
                case AssetPropertyType.APT_Integer:
#elif R2018
                case AssetPropertyType.Integer:
#endif
                    foreach (AssetProperty subProp in subProps)
                    {
                        AssetPropertyInteger intProp = subProp as AssetPropertyInteger;
                        int intValue = intProp.Value;
                    }
                    break;

#if R2016
                case AssetPropertyType.APT_String:
#elif R2018
                case AssetPropertyType.String:
#endif

                    foreach (AssetProperty subProp in subProps)
                    {
                        AssetPropertyString intProp = subProp as AssetPropertyString;
                        string intValue             = intProp.Value;
                        if (intProp.Name == "unifiedbitmap_Bitmap" && intProp.Value != "")
                        {
                            map.Add(ttrgb);
                            map.Add(intProp.Value.Trim().Replace("\\", ""));
                        }
                    }
                    break;
                }
                break;

#if R2016
            case AssetPropertyType.APT_Asset:
#elif R2018
            case AssetPropertyType.Asset:
#endif
                Asset propAsset = prop as Asset;
                for (int i = 0; i < propAsset.Size; i++)
                {
                    ReadAssetProperty(propAsset[i], ttrgb);
                }
                break;

#if R2016
            case AssetPropertyType.APT_Reference:
#elif R2018
            case AssetPropertyType.Reference:
#endif
                break;

            default:
                break;
            }

                        //遍历连接属性,一般位图信息存储在这里  
                        if (prop.NumberOfConnectedProperties == 0)
            {
                return;
            }
            foreach (AssetProperty connectedProp in prop.GetAllConnectedProperties())
            {
                ReadAssetProperty(connectedProp, ttrgb);
            }
        }
Exemplo n.º 4
0
        private ModelMaterial ExportMaterial(Tuple <Document, ElementId> documentAndMaterialId)
        {
            Document      item             = documentAndMaterialId.Item1;
            ElementId     item2            = documentAndMaterialId.Item2;
            ModelMaterial exportedMaterial = new ModelMaterial();
            Material      material         = item.GetElement(item2) as Material;

            if (material != null && material.IsValidObject)
            {
                exportedMaterial.Name = textureFinder.CleanName(material.Name, userSetting);
                if (material.Color.IsValid)
                {
                    exportedMaterial.Color = System.Drawing.Color.FromArgb(material.Color.Red, material.Color.Green, material.Color.Blue);
                }
                exportedMaterial.Shininess    = material.Shininess;
                exportedMaterial.Transparency = material.Transparency;
                if (material.AppearanceAssetId != ElementId.InvalidElementId)
                {
                    Asset asset = (item.GetElement(material.AppearanceAssetId) as AppearanceAssetElement).GetRenderingAsset();
                    if (asset.Size == 0)
                    {
                        AssetSetIterator assetSetIterator = libraryAssetSet.ForwardIterator();
                        while (assetSetIterator.MoveNext())
                        {
                            Asset asset2 = assetSetIterator.Current as Asset;
                            if (asset2 != null && asset2.Name == asset.Name)
                            {
                                asset = asset2;
                                break;
                            }
                        }
                    }
                    textureFinder.FindDiffuseTexturePathFromAsset(exportedMaterial, asset);
                    AssetPropertyDoubleArray4d assetPropertyDoubleArray4d = asset.FindByName("generic_diffuse") as AssetPropertyDoubleArray4d;
                    if (assetPropertyDoubleArray4d != null)
                    {
                        exportedMaterial.Color = System.Drawing.Color.FromArgb((byte)(assetPropertyDoubleArray4d.GetValueAsDoubles().ElementAt(1) * 255.0), ((byte)(assetPropertyDoubleArray4d.GetValueAsDoubles().ElementAt(1) * 255.0)), (byte)(assetPropertyDoubleArray4d.GetValueAsDoubles().ElementAt(2) * 255.0));
                    }
                }
            }
            return(exportedMaterial);
        }