Hi Dirk,
I dont understand. Why do you need to make a new material parameter. This thing should already be there. Do you have Revit lookup installed? Helps a lot in finding out what parameters are in the document or on the element.
I never create a new material parameter, but do create a new material and assign it to the existing parameter.
public static List<ElementId> Set(Document doc, Document famdoc, FamilyEntry f)
{
List<ElementId> mIds = new List<ElementId>();
Material m1 = Materials.GetMaterials(doc, f.Material1.Name);
ElementId mId1, mId2;
if (m1 != null)
{
using (Transaction trans = new Transaction(famdoc, "Change Material Color"))
{
try
{
trans.Start();
mId1 = Material.Create(famdoc, f.Material1.Name);
if (mId1 != null)
{
Material mat1 = famdoc.GetElement(mId1) as Material;
AppearanceAssetElement asset1 = doc.GetElement(m1.AppearanceAssetId) as AppearanceAssetElement;
AppearanceAssetElement asset2 = AppearanceAssetElement.Create(famdoc, f.Material1.Name, asset1.GetRenderingAsset());
FilteredElementCollector coll = new FilteredElementCollector(famdoc).OfClass(typeof(FillPatternElement));
FillPatternElement pattern = null;
if (f.Material1.Name == "your material name1")
{
pattern = coll.FirstOrDefault<Element>(e => e.Name.Equals("Steel")) as FillPatternElement;
}
else if (f.Material1.Name == "your material name2")
{
pattern = coll.FirstOrDefault<Element>(e => e.Name.Equals("Solid fill")) as FillPatternElement;
}
mat1.UseRenderAppearanceForShading = m1.UseRenderAppearanceForShading;
mat1.StructuralAssetId = asset2.Id;
mat1.Color = m1.Color;
if (pattern != null)
{
mat1.CutPatternId = pattern.Id;
}
mat1.CutPatternColor = m1.CutPatternColor;
mat1.AppearanceAssetId = m1.AppearanceAssetId;
mat1.SurfacePatternId = m1.SurfacePatternId;
mat1.SurfacePatternColor = m1.SurfacePatternColor;
FamilyParameter fam_param1 = famdoc.FamilyManager.get_Parameter(BuiltInParameter.STRUCTURAL_MATERIAL_PARAM);
if (fam_param1 != null)
{
famdoc.FamilyManager.Set(fam_param1, mId1);
}
Parameter doc_param = m1.get_Parameter(BuiltInParameter.FILL_PATTERN_ID_PARAM);
FamilyParameter fam_param2 = famdoc.FamilyManager.get_Parameter(BuiltInParameter.FILL_PATTERN_ID_PARAM);
if (doc_param != null && fam_param2 != null)
{
famdoc.FamilyManager.Set(fam_param2, doc_param.AsElementId());
}
if (f.Material2 != null)
{
Material m2 = Materials.GetMaterials(doc, f.Material2.Name);
mId2 = Material.Create(famdoc, f.Material2.Name);
if (mId2 != null)
{
if (f.Material1.Name == "your material name1")
{
pattern = coll.FirstOrDefault<Element>(e => e.Name.Equals("Steel")) as FillPatternElement;
}
else if (f.Material1.Name == "your material name2")
{
pattern = coll.FirstOrDefault<Element>(e => e.Name.Equals("Solid fill")) as FillPatternElement;
}
Material mat2 = famdoc.GetElement(mId2) as Material;
mat2.UseRenderAppearanceForShading = m2.UseRenderAppearanceForShading;
mat2.StructuralAssetId = m2.StructuralAssetId;
mat2.Color = m2.Color;
if (pattern != null)
{
mat2.CutPatternId = pattern.Id;
}
mat2.CutPatternColor = m2.CutPatternColor;
mat2.SurfacePatternColor = m2.SurfacePatternColor;
FamilyParameter fam_param = famdoc.FamilyManager.AddParameter("Concrete Material", BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, false);
if (fam_param != null)
{
famdoc.FamilyManager.Set(fam_param, mId2);
}
}
}
else
{
mId2 = null;
}
if (trans.Commit() == TransactionStatus.Committed)
{
mIds.Add(mId1);
if (mId2 != null)
{
mIds.Add(mId2);
}
return mIds;
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
}
return null;
}
This is the current code that I am using to assign the materials to the family extrusions. Hope it helps. FamilyEntry is just a generic datatype that holds all the stuff I need.
regards
Christian