Hi.
I'm working on a simple add-in that creates a bunch of text styles in a project or family in Revit 2013.
I'm able to only duplicate and add 1 text type and modify it's text parameters. I'm trying to figure out how to loop it based on an array count.
I want to count & loop depending the the array count for "txtHgt".
But I cannot add a variable counter to "noteType" which is a TextNoteType and this is causing the issue.
// Action Code Starts Here Document doc = commandData.Application.ActiveUIDocument.Document; /// Retrieve access to all TextNote Elements FilteredElementCollector collectorUsed = new FilteredElementCollector(doc); ICollection<ElementId> textNotes = collectorUsed.OfClass(typeof(TextNote)) .ToElementIds(); foreach (ElementId textNoteid in textNotes) { TextNote textNote = doc.GetElement( textNoteid) as TextNote; Transaction trans = new Transaction(doc); trans.Start("ChangeParam"); //Setting the Variables string txtOPR = "_"; string[] txtHgt = { "2.38mm (3/32in)", "1.98mm (5/64in)" }; string[] txtbkgd = { "Op", "Tr" }; //string txtType = (txtHgt[1] + txtOPR + txtbkgd[1]); //int txtCount = txtHgt.Count; int txtCount = 1; for (int i = 0; i < txtCount; i++) // for (int i = 0; i < list.Count; i++) { //string txtvar = list[i] as string; //Element num = textNote.TextNoteType.Duplicate(txtvar); //TextNoteType noteType4 = num as TextNoteType; string txtType = (txtHgt[i] + txtOPR + txtbkgd[1]); // Create a duplicate Element ele = textNote.TextNoteType.Duplicate(txtType); TextNoteType noteType = ele as TextNoteType; // Change font parameter if (null != noteType) { // Text Colour (only able to modify RGB Red) byte valRed = 0; //Set colour to black //noteType.get_Parameter("Color").Set(4); noteType.get_Parameter("Color").Set(valRed); // Text Line Weight 1-16 noteType.get_Parameter("Line Weight").Set(2); } } trans.Commit(); } // Return Success
Any Suggestions?
Solved! Go to Solution.
Solved by mfleming.stantec. Go to Solution.
Hi
I think the problem is with the count in the loop. You should change the code to -
...
//Setting the Variablesstring txtOPR = "_";
string[] txtHgt = { "2.38mm (3/32in)", "1.98mm (5/64in)"};
string[] txtbkgd = { "Op", "Tr"};
//string txtType = (txtHgt[1] + txtOPR + txtbkgd[1]);//int txtCount = txtHgt.Count;inttxtCount = 2;
for (inti = 0; i < txtCount; i++)
// for (int i = 0; i < list.Count; i++)
{
//string txtvar = list[i] as string;//Element num = textNote.TextNoteType.Duplicate(txtvar);//TextNoteType noteType4 = num as TextNoteType;stringtxtType = (txtHgt[i] + txtOPR + txtbkgd[i]);
// Create a duplicateElementele = textNote.TextNoteType.Duplicate(txtType);
TextNoteType noteType = ele asTextNoteType;
// Change font parameterif (null!= noteType)
{
// Text Colour (only able to modify RGB Red)byte valRed = 0; //Set colour to black//noteType.get_Parameter("Color").Set(4);
noteType.get_Parameter(
"Color").Set(valRed);
// Text Line Weight 1-16
noteType.get_Parameter(
"Line Weight").Set(2);
}
}
trans.Commit();
...''
After the above changes, I can see both the textnote types created:
Hope this helps.
cheers
The loop is now working.
I'm trying to adjust the loop count based on the number of possible text sizes.
I'm using the following:
//Setting the Variables
string txtOPR = "_";
string[] txtHgt = { "1.58mm (1/16in)", "1.98mm (5/64in)", "2.38mm (3/32in)", "3.17mm (1/8in)", "4.76mm (3/16in)", "6.35mm (1/4in)", "12.7mm (1/2in)" };
string[] txtbkgd = { "Op", "Tr" };
int txtCount = txtHgt.Length * txtbkgd.Length;
Which works fine.
The next part is changeing the txtType "string value based on the specific location of the count.
I want to be ablt to change the entered Text Style Type Name after I have completed all possible values for txtHgt & txtbkgd[0]. After I enter those, I want to enter txtHgt & txtBkgd[1].
I'm using the following statement.
for (int i = 0; i < txtCount; i++) { if (i <= txtHgt.Length) { string txtType = (txtHgt[i] + txtOPR + txtbkgd[0]); } else { string txtType = (txtHgt[i] + txtOPR + txtbkgd[1]); }
The name 'txtType' does not exist in the current context Error:
Which is saying it's outside the current scope or not defined.
What am I missing?
Matt
I have completed the project.
Not 100% clean, but it works.
I had to add some if statements to check for values and increase array values as needed.
Completed code.
using System; using System.Collections.Generic; using System.Collections; using System.Windows.Forms; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using System.Text; using System.Linq; namespace CreateTextType { [Transaction(TransactionMode.Manual)] public class cmdTextType : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { try { // Action Code Starts Here Document doc = commandData.Application.ActiveUIDocument.Document; /// Retrieve access to all TextNote Elements FilteredElementCollector collectorUsed = new FilteredElementCollector(doc); ICollection<ElementId> textNotes = collectorUsed.OfClass(typeof(TextNote)) .ToElementIds(); foreach (ElementId textNoteid in textNotes) { TextNote textNote = doc.GetElement( textNoteid) as TextNote; Transaction trans = new Transaction(doc); trans.Start("ChangeParam"); //Setting the Variables string txtOPR = "_"; string[] txtHgt = { "1.58mm (1/16in)", "1.98mm (5/64in)", "2.38mm (3/32in)", "3.17mm (1/8in)", "4.76mm (3/16in)", "6.35mm (1/4in)", "12.7mm (1/2in)" }; string[] txtbkgd = { "Op", "Tr"}; int bkgCount = 0; int txtCount = txtHgt.Length * txtbkgd.Length; for (int i = 0; i < txtCount; i++) { if (i < txtHgt.Length && bkgCount == 0) { bkgCount = 0; } else { if (bkgCount == 0) { i = 0; } bkgCount = 1; if (i == txtHgt.Length && bkgCount == 1) { //break; goto IfDone; } } string txtType = (txtHgt[i] + txtOPR + txtbkgd[bkgCount]); // Create a duplicate Element ele = textNote.TextNoteType.Duplicate(txtType); TextNoteType noteType = ele as TextNoteType; // Change font parameter if (null != noteType) { noteType.get_Parameter("Text Size").Set((3.0 / 32.0) * (1.0 / 12.0)); // Text Tab Size for 3/32" = (3.0 / 32.0) * (1.0 / 12.0) } } IfDone: trans.Commit(); } // Return Success return Result.Succeeded; } catch (Exception ex) { // Failure Message message = ex.Message; return Result.Failed; } } } }