Revit 2013 Product GUIDs and GUID Algorithm

Every year anew, people ask for the Revit product GUIDs used to identify the Revit installation and stored in the Windows registry under

  • HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUninstall

There are different keys for each of the three Revit flavours, plus the Revit 2013 one-box solution, and for 32 and 64 bit operating systems.

We discussed this topic in the past for

Revit 2010 and previous versions
,

Revit 2011
and

Revit 2012
,
when the ‘perpetual GUID algorithm’ was introduced.

The install path is much less of an issue nowadays, since you now use an

add-in manifest
to
inform Revit how to load your add-in, and the add-in manifest path is well known.

It is actually recommended to install .NET add-ins for both AutoCAD and Revit

in or under the same directory as acad.exe and revit.exe
,
respectively: “It’s safest to place assemblies at a location beneath the calling executable.”

The best way to determine the Revit install location is to use the

RevitAddInUtility
,
which provides an API for an installer to query that and also to generate an add-in manifest file from the relevant properties you specify.
The same RevitAddInUtility assembly DLL works transparently on both 32 and 64 bits.

Revit Product GUIDs up to Revit 2013

Still, the product GUID may be important for other uses.
Here is the updated list including the GUIDs for the initial Revit 2013 versions:

td.j571
{
border-color: darkgrey;
border-width: 1px;
border-style: solid;
}
.j571r
{
border-color: darkgrey;
border-width: 1px;
border-style: solid;
text-align: right;
}

2013 64 bit RAC 7346B4A0-1300-0110-0409-705C0D862004
RST 7346B4A0-1300-0210-0409-705C0D862004
RME 7346B4A0-1300-0310-0409-705C0D862004
One-Box 7346B4A0-1300-0510-0409-705C0D862004
32 bit RAC 7346B4A0-1300-0100-0409-705C0D862004
RST 7346B4A0-1300-0200-0409-705C0D862004
RME 7346B4A0-1300-0300-0409-705C0D862004
One-Box 7346B4A0-1300-0500-0409-705C0D862004
2012 64 bit RAC 7346B4A0-1200-0110-0409-705C0D862004
RST 7346B4A0-1200-0210-0409-705C0D862004
RME 7346B4A0-1200-0310-0409-705C0D862004
32 bit RAC 7346B4A0-1200-0100-0409-705C0D862004
RST 7346B4A0-1200-0200-0409-705C0D862004
RME 7346B4A0-1200-0300-0409-705C0D862004
2011 64 bit RAC 94D463D0-2B13-4181-9512-B27004B1151A
RST 23853368-22DD-4817-904B-DB04ADE9B0C8
RME C31F3560-0007-4955-9F65-75CB47F82DB5
32 bit RAC 4AF99FCA-1D0C-4D5A-9BFE-0D4376A52B23
RST 0EE1FCA9-7474-4143-8F22-E7AD998FACBF
RME CCCB80C8-5CC5-4EB7-89D0-F18E405F18F9
2010 64 bit RAC 2A8EEE2F-4A9E-43d8-AA07-EC8A316B2DEB
RST BC9C0A08-DEA4-4138-A7FB-8F68866DB0C1
RME A1BD042B-8A6F-4e37-92A3-78921BB45B05
32 bit RAC 572FBF5D-3BAA-42ff-A468-A54C2C0A17C3
RST 939D29FC-B82D-42a7-BB1E-8E3F121505CC
RME 5C8281B1-B927-495a-A0FF-AB4BDFAE505C
2009 64 bit RAC D2466208-7348-4214-B01E-7BC8729E2BD3
RST B354FCF5-CF64-4fa2-AA84-9D9B2A6FA649
RME 4A98F976-01B5-40e8-A496-AEFD85C3A446
32 bit RAC A3A37DA6-70C0-497C-BCB1-148E9EC1D32E
RST C4B3B3C3-2EE9-48D3-9BF5-4443F7ECF759
RME E3781DCB-A650-4E66-9B74-67A1B17F052C
2008 RAC 4A11206C-4377-49E8-911E-B11548658FF3
RST 8D0AE0BB-4FE5-491D-A284-3B363F02E639
RME 60A2743E-C881-4880-94ED-96445E38616F
9.0 Revit Building D11DB6CB-0332-4735-B312-B919741D975E
3 RST 3F11CEE0-D30D-41ce-8522-922B5D8BB324
8.1 Revit Building 7EBC0489-5E47-498D-BE31-B094484612E9
2 RST BE814F63-629D-4fd8-B628-1437AC10F9D4

Perpetual Revit Product GUID Algorithm

As you can see above, all Revit GUIDs from Revit 2012 onwards have a strong similarity with each other.

This is because they are generated according to the following pattern:


{7346B4At-uuvv-wwxy-zzzz-705C0D862004}

The alphabetical characters above stand for:

  1. [0/1]: ProductCode/UpgradeCode
  2. [12, 13, …]: Major release version [12, 13]
  3. [00, 01, …]: Release subversion
  4. [01/02/03/05]: RAC/RST/RME/One-Box
  5. [0/1]: Win32/x64
  6. [0/1]: Global/Language Pack
  7. [0409…]: Language

The last item, represented by ‘z’, identifies the language.
It uses the hexadecimal

LCID
or
language code identifier.
The ones supported by Revit are listed in the following table:

lang .NET code HEX LCID DEC LCID Language Codepage
chs zh-CN 0804 2052 Chinese Simpl. 936
cht zh-TW 0404 1028 Chinese Trad. 950
csy cs-CZ 0405 1029 Czech 1250
deu de-DE 0407 1031 German 1252
enu en-US 0409 1033 English 1252
esp es-ES 040A 1034 Spanish 1252
fra fr-FR 040C 1036 French 1252
hun hu-HU 040E 1038 Hungarian 1250
ita it-IT 0410 1040 Italian 1252
jpn ja-JP 0411 1041 Japanese 932
kor ko-KR 0412 1042 Korean 949
plk pl-PL 0415 1045 Polish 1250
ptb pt-BR 0416 1046 Portuguese Brazil 1252
rus ru-RU 0419 1049 Russian 1251

Applying this algorithm to the different Revit 2013 flavours produces the values listed in the table above.


Comments

14 responses to “Revit 2013 Product GUIDs and GUID Algorithm”

  1. Valentin Avatar
    Valentin

    I’m sorry to post here, my question has realy no report but when I want to ask you a question which I didn’t found on your website, where can I post it?
    V.

  2. Dear Valentin,
    What is your question about? Just submit it as a comment on any old related blog post.
    Cheers, Jeremy.

  3. Valentin Avatar
    Valentin

    Ok thanks.
    My question is, i’m working on a plugin which ask the user to select a face, but it don’t work on linked file. i found something using ObjectType.PointOnElement for selection but it don’t for with any face for the moment. Is there an easy way to do that or do you already have a solution?
    Thank you for help
    V.

  4. Hi Jeremy,
    when comparing the 2013 ProductType enumeration with the former one, I see that some new members are not represented by these product GUIDs.
    May it be possible that the gap between MEP [3] and One-Box [5] will be filled up during the next time ?
    Bye,
    Rudolf

  5. Dear Valentin,
    Nope, sorry, there is no easy way to work on a face in a linked file, and I am not aware of any solution for this.
    Cheers, Jeremy.

  6. Dear Rudolf,
    Very astute observation, even if I say so myself… I had the same question as well… great minds think alike :-)
    Unfortunately, the answer to this is “no comment” :-)
    Cheers, Jeremy.

  7. Hi Jeremy,
    “No comment” says more than a thousand words ;-)
    Bye,
    Rudolf

  8. Valentin Avatar
    Valentin

    I found a solution using reference.ConvertToStableRepresentation(Document).
    This string contains the ref document unique ID, his name, and the ID of the picked element in this doc. You can get his position in the ref doc and if you insert origin to origin, the element have the same position in the two documents. It’s quite long to write it here but i can send the cs if you want.
    Thank you for help
    V.

  9. Dear Valentin,
    Wow, fantastic, that sounds like an absolutely brilliant solution!
    Congratulations on discovering that.
    Yes, please send me the source code, preferably with a short description of the problem and the solution in your own words, and I will happily create a post from it. Thank you!
    Cheers, Jeremy.

  10. Valentin Avatar
    Valentin

    I tried to write it here but it don’t looks fine so i made an sln.
    Where can i send the file?
    V.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.UI.Selection;
    using Autodesk.Revit.Attributes;
    namespace SelectFaceInLinkedFile
    {
    [TransactionAttribute(TransactionMode.Manual)]
    public class SelectFaceInLinkedFile : IExternalCommand
    {
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
    UIApplication uiapp = commandData.Application;
    PlanarFace Plan = SelectFace(uiapp);
    return Result.Succeeded;
    }
    public static PlanarFace SelectFace(UIApplication uiapp)
    {
    Document doc = uiapp.ActiveUIDocument.Document;
    //get all ref doc.
    System.Collections.Generic.IEnumerable doc2 = GetLinkedDocuments(doc);
    //get the ref of a selected plane
    Reference pickedRef = null;
    Selection sel = uiapp.ActiveUIDocument.Selection;
    pickedRef = sel.PickObject(ObjectType.PointOnElement, “Please select a Face”);
    Element elem = doc.get_Element(pickedRef.ElementId);
    //get the true position picked in the active document
    XYZ pos = pickedRef.GlobalPoint;
    //get the ID of the element containing the face you picked in the active document and in his host document
    string s = pickedRef.ConvertToStableRepresentation(doc);
    string[] tab_str = s.Split(‘:’);
    string id = tab_str[tab_str.Length – 3];
    int ID;
    Int32.TryParse(id, out ID);
    if ((elem.GetType() == typeof(RevitLinkType)) || ((elem.GetType() == typeof(Instance))))
    {
    foreach (Document d in doc2)
    {
    if (elem.Name.Contains(d.Title))
    {
    Element element = d.get_Element(new ElementId(ID));
    Options ops = new Options();
    ops.ComputeReferences = true;
    //write the name of the element and the number of solids in this only for control ut show the possibilities
    MessageBox.Show(element.Name, element.get_Geometry(ops).Objects.Size.ToString());
    GeometryObject obj = element.get_Geometry(ops).Objects.get_Item(0);
    //test all surfaces of solids in the element and return the one containing the picked point as a planarface to build my sketchplan
    foreach (GeometryObject obj2 in element.get_Geometry(ops).Objects)
    {
    if (obj2.GetType() == typeof(Solid))
    {
    Solid solid2 = obj2 as Solid;
    foreach (Face face2 in solid2.Faces)
    {
    try
    {
    if (face2.Project(pos).XYZPoint.DistanceTo(pos) == 0)
    {
    return face2 as PlanarFace;
    }
    }
    catch (NullReferenceException)
    {
    }
    }
    }
    }
    }
    }
    }
    return null;
    }
    //this part is not mine, i found it on the internet, i don’t anderstand all the code
    public static IEnumerable GetLinkedFileReferences(Document _document)
    {
    var collector = new FilteredElementCollector(_document);
    var linkedElements = collector.OfClass(typeof(RevitLinkType)).Select(x => x.GetExternalFileReference()).ToList();
    return linkedElements;
    }
    public static IEnumerable GetLinkedDocuments(Document _document)
    {
    var linkedfiles = GetLinkedFileReferences(_document);
    var linkedFileNames = linkedfiles.Select(x => ModelPathUtils.ConvertModelPathToUserVisiblePath(x.GetAbsolutePath())).ToList();
    return _document.Application.Documents.Cast().Where(doc => linkedFileNames.Any(fileName => doc.PathName.Equals(fileName)));
    }
    }
    }

  11. Dear Valentin,
    Thank you very much for your great idea, research and sample!
    I published it last week:
    http://thebuildingcoder.typepad.com/blog/2012/05/selecting-a-face-in-a-linked-file.html
    I hope you like the result :-)
    Cheers, Jeremy.

  12. If searched hi and low and can’t seem to find an equivalent list for AutoCAD Products. Do you happen to know if there is one out there Jeremy?

  13. Dear CGsoldier,
    Nope. You can always ask Kean:
    http://through-the-interface.typepad.com
    Or try the Autodesk AutoCAD API discussion group.
    Cheers, Jeremy.

  14. Thanks Jeremy

Leave a Reply to ValentinCancel reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading