The Global Archicad Community

Stay informed. Get help. Share your knowledge.

Discussions about using GRAPHISOFT's tools (API DevKit) for independent software developers

Moderators: Karl Ottenstein, LaszloNagy, ejrolon, Barry Kelly, gkmethy, rmasaki, MOREH Tamas, Akos Somorjai, Ed Brown, Mihály Palenik, Tibor Lorántfy

User avatar
By Ady84a
#314406
Hello,

Is there a way to to change the Zone name using Python?

I have seen that Zone number can be changed.
Creating a new custom property and considering it as Zone name, doesn't solve our Problem. We need to change the actual Zone name in the Zone stamp.

Best regards,
User avatar
By runxel
#314407
Yes, this is possible.
Have a look at the code below. It's not that hard, once one understands that there are some shenanigans to come over (resulting from the use of heavily custom classes and types on the Python package side).
Code: Select all
from archicad import ACConnection

conn = ACConnection.connect()
assert conn

acc = conn.commands
act = conn.types
acu = conn.utilities

# get all zones, assign to `elements`
elements = acc.GetElementsByType('Zone')

# prop now holds the GUID of the requested property
prop = acu.GetBuiltInPropertyId('Zone_ZoneName')

# returns a list of all the property values of the elements in question
propval_list = acc.GetPropertyValuesOfElements(elements, [prop])

# replace all occurrences of the first string with the second one
#  (this is just a very basic example, of course you could do
#   much more sophisticated versions)
zonename_to_replace = "Wohnen"
zonename_new = "Main Room"


for i, elem in enumerate(elements):
    # propstr holds the actual string of the current zone name
    propstr = propval_list[i].propertyValues[0].propertyValue.value
    # check if we got a match
    if propstr == zonename_to_replace:
        # if so, construct a new prop value
        new_val = act.ElementPropertyValue(
            elem.elementId, prop, act.NormalStringPropertyValue(zonename_new))
        # set the zone name
        acc.SetPropertyValuesOfElements([new_val])