Autodesk Revit API
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
C# - Loop with TextNote Type not working.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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.
Re: C# - Loop with TextNote Type not working.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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
Saikat Bhattacharya
Re: C# - Loop with TextNote Type not working.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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
Re: C# - Loop with TextNote Type not working.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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;
}
}
}
}
