Change text width in Revit

Hello,
Just want to say thank you for the script specified in this thread
https://forum.dynamobim.com/t/revit-text-notes-drag/30226

I decided to add a variable that can be entered from the dynamo player and set the desired text width.
Everything went well, until I got 0.14848 in the width value
Where does this value come from?
How can I convert it to millimeters?
As a result, I would like to manually set the width of the text I need.

@Storm ,

i have also no idea? what is “sad” ?

Hi,

Which version do you use?
I think you need to convert the width.

Hi, just test, when user write string to IN[1] script use basic value “100”
This is not due to the fact that the dynamo text width gives out an incomprehensible

Hello
Dynamo 2.12.1.8411
Revit 2022.1
I tried to convert and select the conversion factor, but it turned out to be different for fonts of 2.5 and 3.5 mm, and as a result, for some reason, added different values ​​​​in Revit on each start of script

Does this work?

import clr #.NET Laden
import sys #sys is de fundamentele Python bibliotheek
#de standaard IronPython-bibliotheken
#sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib') #Imports the
#standaard IronPython-bibliotheken, die alles dekken, van servers en
#encryptie tot reguliere expressies.
import System #The System namespace in de hoofdmap .NET
from System import Array #.NET class voor het verwerken van array-informatie
import System.Collections.Generic as MGen #Module kan nu benaderd worden met MGen.xxxx
#from System.Collections.Generic import * #Hiermee kunt u generieke afhandelen. Revit's API
#soms wil hard-getypte 'generieke' lijsten, genaamd ILists. Als je niet nodig hebt
#deze kunt u deze regel verwijderen.
clr.AddReference('ProtoGeometry')  #Een Dynamo-bibliotheek voor zijn proxygeometrie
#classes. Je hebt dit alleen nodig als je interactie hebt met geometrie.
import Autodesk.DesignScript.Geometry as AGeo #Module kan worden opgeroepen a=met AGeo.xxxx
#from Autodesk.DesignScript.Geometry import * #Laadt alles in Dynamo's
#geometriebibliotheek
clr.AddReference("RevitNodes") #Dynamo's nodes voor Revit
import Revit #Laad in de Revit-namespaces in RevitNodes
clr.ImportExtensions(Revit.Elements) #Meer laden van Dynamo's Revit-bibliotheken
clr.ImportExtensions(Revit.GeometryConversion) #Meer laden van Dynamo's
#Revit-bibliotheken. Je hebt dit alleen nodig als je interactie hebt met geometrie.
clr.AddReference("RevitServices") #Dynamo's classes voor het omgaan met Revit-documenten
import RevitServices 
from RevitServices.Persistence import DocumentManager #Een interne Dynamo class
#dat het document bijhoudt waaraan Dynamo momenteel is gekoppeld
from RevitServices.Transactions import TransactionManager #Een Dynamo class voor
#transacties openen en sluiten om de database van het Revit-document te wijzigen

clr.AddReference("RevitAPI") #Verwijzing naar Revit's API DLL's toevoegen
clr.AddReference("RevitAPIUI") #Verwijzing naar Revit's APIUI DLL's toevoegen

import Autodesk #Loads the Autodesk namespace
import Autodesk.Revit.DB as RDB #Loading Revit's API UI classes module kan nu worden aangeroepen met RDB.xxxx
#from Autodesk.Revit.DB import * #Loading Revit's API UI classes
import Autodesk.Revit.UI as RUI # Loading Revit's API UI classes als RUI.xxxx
#from Autodesk.Revit.UI import * #Loading Revit's API UI classes

doc = DocumentManager.Instance.CurrentDBDocument #Dit is het actieve Revit document
uiapp = DocumentManager.Instance.CurrentUIApplication #Een handle instellen voor het actieve Revit UI-document
app = uiapp.Application  #Een handle instellen op de momenteel geopende instantie van de Revit-toepassing
uidoc = uiapp.ActiveUIDocument #Een handle instellen op de momenteel geopende instantie van de Revit UI-toepassing
revit_version = int(doc.Application.VersionNumber)
# code omrekenen revit feet naar huidig ingestele document units
if revit_version >= 2022:
    ForgeLength = "autodesk.spec.aec:length-1.0.0"  # zie voor lijst ForgeTypeIds.xlsx in de map handleidingen
    ForgeTypeLength = RDB.ForgeTypeId(ForgeLength)
    getDocUnits = doc.GetUnits()
    getDisplayUnitsLength = getDocUnits.GetFormatOptions(ForgeTypeLength).GetUnitTypeId()
else:
    getDocUnits = doc.GetUnits()
    getDisplayUnits = getDocUnits.GetFormatOptions(RDB.UnitType.UT_Length).DisplayUnits


def ToRevitUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnits)


def ToDynamoUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnits)

def ToRevitUnitsLengthFromMM(InVal):
	if revit_version >= 2022:
		return RDB.UnitUtils.Convert(InVal, RDB.UnitTypeId.Millimeters, RDB.UnitTypeId.Feet)
	else:
		return RDB.UnitUtils.Convert(InVal, RDB.DisplayUnitType.DUT_MILLIMETERS, RDB.DisplayUnitType.DUT_DECIMAL_FEET)
	
def ToRevitUnitsLengthFromMM(InVal):
	if revit_version >= 2022:
		return RDB.UnitUtils.Convert(InVal, RDB.UnitTypeId.Millimeters, RDB.UnitTypeId.Feet)
	else:
		return RDB.UnitUtils.Convert(InVal, RDB.DisplayUnitType.DUT_MILLIMETERS, RDB.DisplayUnitType.DUT_DECIMAL_FEET)
		
# einde code omrekenen revit feet naar huidig ingestelde document units
# Hieronder kan je dan gaan programmeren
# Gebruik boiler template


if isinstance(IN[0], list):
    txts = UnwrapElement(IN[0])
else:
    txts = [UnwrapElement(IN[0])]

if isinstance(IN[0], int):
	txtwth = IN[1]
else:
	txtwth = 100

# Place your code below this line
output = []
for txt in txts:
    TransactionManager.Instance.EnsureInTransaction(doc)
    try:
        width = txt.Width
        txt.Width = width * 2 #change this to whatever width needed
        output.append("success")
    except:
        output.append("failed")
    TransactionManager.Instance.TransactionTaskDone()

# Assign your output to the OUT variable.
OUT = output, txtwth, ToDynamoUnitsLength(width)

#Start Transaction
#TransactionManager.Instance.EnsureInTransaction(doc)
#Eind Transactie
#TransactionManager.Instance.TransactionTaskDone()
1 Like

Thank you very much, but multiplication worked correctly

for txt in txts:
    TransactionManager.Instance.EnsureInTransaction(doc)
    try:
        width = txt.Width
        txt.Width = width * 2
        output.append("success")
    except:
        output.append("failed")
    TransactionManager.Instance.TransactionTaskDone()

I just wanted to change it to summ with another number (string 100-102 in your code), which wrote in “IN[1]” or overwrite that
But if i try to do summ width with some number or overwrite it → gives failed or still counts incorrectly

P.S. I’m bad in python, sorry

You’re welcome.

I don’t understand what your end goal is.
Can you explain me that?

This part multiplies width of text

try:
        width = txt.Width
        txt.Width = width * 2
        output.append("success")

I wanted change it to summ (for example, i had width of text 200, i wanted increase or decrease it on 50 (or -50)) OR overwrite it (just change my 200 to 50). No matter which of these options
But if you enter a number (for example, 50), it turns out that the width of the text in dynamo showed 0.1484… and he tried to add 50 to this number, he gave an error and went to the faild part

@Storm I think the problem lies in converting and running your script again.

  • From rvt 22 there has been a change in the unit, see more information here:
    https://archi-lab.net/handling-the-revit-2022-unit-changes/
  • When you run your script for the 2nd time you see that the value changes, logical because your script has changed the width and takes this value and starts calculating with it.
  • You talk about 50, can you make this a fixed value?

@Storm
Try this:

import clr #.NET Laden
import sys #sys is de fundamentele Python bibliotheek
#de standaard IronPython-bibliotheken
#sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib') #Imports the
#standaard IronPython-bibliotheken, die alles dekken, van servers en
#encryptie tot reguliere expressies.
import System #The System namespace in de hoofdmap .NET
from System import Array #.NET class voor het verwerken van array-informatie
import System.Collections.Generic as MGen #Module kan nu benaderd worden met MGen.xxxx
#from System.Collections.Generic import * #Hiermee kunt u generieke afhandelen. Revit's API
#soms wil hard-getypte 'generieke' lijsten, genaamd ILists. Als je niet nodig hebt
#deze kunt u deze regel verwijderen.
clr.AddReference('ProtoGeometry')  #Een Dynamo-bibliotheek voor zijn proxygeometrie
#classes. Je hebt dit alleen nodig als je interactie hebt met geometrie.
import Autodesk.DesignScript.Geometry as AGeo #Module kan worden opgeroepen a=met AGeo.xxxx
#from Autodesk.DesignScript.Geometry import * #Laadt alles in Dynamo's
#geometriebibliotheek
clr.AddReference("RevitNodes") #Dynamo's nodes voor Revit
import Revit #Laad in de Revit-namespaces in RevitNodes
clr.ImportExtensions(Revit.Elements) #Meer laden van Dynamo's Revit-bibliotheken
clr.ImportExtensions(Revit.GeometryConversion) #Meer laden van Dynamo's
#Revit-bibliotheken. Je hebt dit alleen nodig als je interactie hebt met geometrie.
clr.AddReference("RevitServices") #Dynamo's classes voor het omgaan met Revit-documenten
import RevitServices 
from RevitServices.Persistence import DocumentManager #Een interne Dynamo class
#dat het document bijhoudt waaraan Dynamo momenteel is gekoppeld
from RevitServices.Transactions import TransactionManager #Een Dynamo class voor
#transacties openen en sluiten om de database van het Revit-document te wijzigen

clr.AddReference("RevitAPI") #Verwijzing naar Revit's API DLL's toevoegen
clr.AddReference("RevitAPIUI") #Verwijzing naar Revit's APIUI DLL's toevoegen

import Autodesk #Loads the Autodesk namespace
import Autodesk.Revit.DB as RDB #Loading Revit's API UI classes module kan nu worden aangeroepen met RDB.xxxx
#from Autodesk.Revit.DB import * #Loading Revit's API UI classes
import Autodesk.Revit.UI as RUI # Loading Revit's API UI classes als RUI.xxxx
#from Autodesk.Revit.UI import * #Loading Revit's API UI classes

doc = DocumentManager.Instance.CurrentDBDocument #Dit is het actieve Revit document
uiapp = DocumentManager.Instance.CurrentUIApplication #Een handle instellen voor het actieve Revit UI-document
app = uiapp.Application  #Een handle instellen op de momenteel geopende instantie van de Revit-toepassing
uidoc = uiapp.ActiveUIDocument #Een handle instellen op de momenteel geopende instantie van de Revit UI-toepassing
revit_version = int(doc.Application.VersionNumber)
# code omrekenen revit feet naar huidig ingestele document units
if revit_version >= 2022:
    ForgeLength = "autodesk.spec.aec:length-1.0.0"  # zie voor lijst ForgeTypeIds.xlsx in de map handleidingen
    ForgeTypeLength = RDB.ForgeTypeId(ForgeLength)
    getDocUnits = doc.GetUnits()
    getDisplayUnitsLength = getDocUnits.GetFormatOptions(ForgeTypeLength).GetUnitTypeId()
else:
    getDocUnits = doc.GetUnits()
    getDisplayUnits = getDocUnits.GetFormatOptions(RDB.UnitType.UT_Length).DisplayUnits


def ToRevitUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnits)


def ToDynamoUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnits)

def ToRevitUnitsLengthFromMM(InVal):
	if revit_version >= 2022:
		return RDB.UnitUtils.Convert(InVal, RDB.UnitTypeId.Millimeters, RDB.UnitTypeId.Feet)
	else:
		return RDB.UnitUtils.Convert(InVal, RDB.DisplayUnitType.DUT_MILLIMETERS, RDB.DisplayUnitType.DUT_DECIMAL_FEET)
	
		
# einde code omrekenen revit feet naar huidig ingestelde document units
# Hieronder kan je dan gaan programmeren
# Gebruik boiler template


if isinstance(IN[0], list):
    txts = UnwrapElement(IN[0])
else:
    txts = [UnwrapElement(IN[0])]


# Place your code below this line
output = []
for txt in txts:
    TransactionManager.Instance.EnsureInTransaction(doc)
    try:
        txt.Width = ToRevitUnitsLengthFromMM(50)
        output.append(ToDynamoUnitsLength(txt.Width))
    except:
        output.append(None)
    TransactionManager.Instance.TransactionTaskDone()

# Assign your output to the OUT variable.
OUT = output

1 Like

Hello, it’s great, i entered a variable to give me the required width and put it instead of “50” in your code, everything worked fine. I’ll test it in my project
Thank you very much!

2 Likes

Glad to hear! :slight_smile: It’s the unit change in Revit 2022 :grin:, check the link above for more information.

Ye, thank u, I’ll check it necessarily