Revit API

Reply
Active Contributor
mfleming.stantec
Posts: 32
Registered: ‎10-06-2009
Message 1 of 4 (379 Views)
Accepted Solution

C# - Loop with TextNote Type not working.

379 Views, 3 Replies
09-11-2012 10:18 PM

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?

Employee
saikat
Posts: 185
Registered: ‎08-16-2007
Message 2 of 4 (369 Views)

Re: C# - Loop with TextNote Type not working.

09-14-2012 01:55 PM in reply to: mfleming.stantec

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:

 

textnotetype.png

 

Hope this helps.

cheers



Saikat Bhattacharya

Active Contributor
mfleming.stantec
Posts: 32
Registered: ‎10-06-2009
Message 3 of 4 (362 Views)

Re: C# - Loop with TextNote Type not working.

09-15-2012 12:19 AM in reply to: saikat

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

 

Active Contributor
mfleming.stantec
Posts: 32
Registered: ‎10-06-2009
Message 4 of 4 (350 Views)

Re: C# - Loop with TextNote Type not working.

09-15-2012 10:14 PM in reply to: mfleming.stantec

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;

            }
        }
    }
}

 

 

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community


Revit Exchange Apps

Created by the community for the community, Autodesk Exchange Apps for Revit helps you achieve greater speed, accuracy, and automation from concept to manufacturing.

Connect with Revit

Twitter

Facebook

Blogs

Youtube