December 29, 2017

ACA: Curved Mass Elements - Part 2: Shape Impact

First article in the series: ACA: Curved Mass Elements - Part 1: FacetDev and FacetMax

The Shape property of a curved Mass Element will affect how it reacts to the FacetDev and FacetMax settings. Any of the standard shapes that involve a curve, Arch, Barrel Vault, Cone, Cylinder, Dome, Doric and Sphere, will be initially placed based on the settings of FacetDev and FacetMax, and will update when changes to the FacetDev value would result in a different number of segments. A change to the value of FacetMax will not result in a change to the faceting of existing Mass Elements, even if it would cause a lesser or greater number of segments. The effect of a change to FacetMax on existing objects will be seen only if the value of FacetDev is subsequently changed by an amount sufficient to result in a different number of facets.

Mass Element Extrusions and Revolutions that have curves in the defining Profile will also retain the ability to change the number of facets when FacetDev is changed. Freeform Mass Elements, however, will have the number of facets present at the time of creation, regardless of later changes to the value of FacetDev. How can you end up with a Freeform Mass Element? The following will produce one:
  • Use of the Boolean tools to create Unions, Subtractions or Intersections of two or more Mass Elements that results in a shape that cannot be created by extruding a Profile placed in the X-Y plane in which the first object was created.
  • Use of the AecMassElementConvert command to convert an AEC object or an AutoCAD 3D Solid to a Mass Element. The Convert to Mass Element tool on the out-of-the-box Massing palette (in the Design tool palette group, in the US Imperial content, and, likely other content as well) runs this command. You can also access this command by selecting an AutoCAD 3D Solid, right clicking and chosing Convert to > Mass Element from the context menu.
  • Use of the ConvertMEToFFME command to convert an AutoCAD 3D Solid or a standard-shape Mass Element to a Freeform Mass Element. For standard-shape Mass Elements, this command can be invoked by selecting the Mass Element, right clicking and choosing Convert to > Freeform Mass Element on the context menu. NOTE: If you right click on one of the standard-shape tools on the Massing tool palette, and choose Apply Tool Properties to > Mass Element, the ConvertMEToFFME command will be run, but the 3D Solid or Mass Element will be converted into a Mass Element with the standard shape of the tool which was right-clicked.
In the images below, all three things started from the same source. At the lower left, there are the original objects: a Cylinder base and a Cone on top. In the middle, with FacetDev set to 20, with the Cylinder selected, Boolean > Union was selected from the right-click context menu, and then the Cone was chosen. The same operation was performed on the source objects in the upper right, but with FacetDev set to 0.5. In the top image, FaceDev is set to 0.5, and you can see that the facets on the Freeform Mass Element in the upper right match those of the Cylinder and Cone in the lower left, while the Freeform Mass Element in the middle retains the faceting that was current when it was created. For comparison, FacetDev is set to 20 in the lower image, and you can see that the faceting of the middle Freeform Mass Element matches that of the Cylinder and Cone in the lower left, while the faceting of the Freeform Mass Element in the upper right remains as it was at the time it was created.

December 27, 2017

Dynamo: Forcing Exactly One-Half to Round Up

In the same Dynamo graph on which my previous post was based, I had a need to round a real number to the nearest whole number, and I wanted a decimal of exactly .5 to round up. The Math.Round node met all my rounding needs except for when the decimal value is exactly 0.5; that node "rounds to even," which means that both 1.5 and 2.5 will round to 2, since 2 is even. Statistically, when dealing with a large amount of data, always rounding exactly 0.5 to even (or rounding always to odd) makes sense, as always rounding up would tend to skew any mathematical analysis of the data to a higher value. In this case, the number was being used only as a label, and I decided that it should always round up.

I put together the following nodes to achieve the desired results. Numbers in the explanation below refer to the numbers in the image. As always, you can click on the image to see the full-size version.

  1. This code block provides the source number to be processed.
  2. The nodes in Area 2 divide the source number by 100. In the example in the image, this results in a value of 12.5. This value is fed to the nodes in Areas 3, 4 and 5.
  3. The Math.Floor node truncates any fractional part in the value from Area 2, resulting in an integer of 12 in the example. This value is fed to the nodes in Areas 5 and 6.
  4. The Math.Round node takes the value from Area 2 and rounds it. For the example value of 12.5, the .5 is rounded to even, or 12. The result is a floating point number. This value is fed to a node in Area 7.
  5. The nodes in Area 5 take the value from Area 2 (12.5 in the example) and Area 3 (12 in the example) and subtract the Area 3 value from the Area 2 value. The result of the subtraction (0.5 in the example) is compared to the value in the Code Block, which is 0.5, by the == node. If the two are equal, the result of the comparison is true, as it is in the example; otherwise, it is false. This result is fed to the test input of the If node in Area 8.
  6. The Area 6 nodes take the integer result from Area 3 and add the value in the Code Block, or 1.0, to it. This is the rounded up value; it is 13 in the example.
  7. The two Math.Floor nodes in Area 7 take the real number results from Areas 4 and 7 and convert them to integers. These values were already whole numbers, but the Math.Round and + nodes output is a floating point number, not an integer. The application for which this rounding is being done required an integer. If it does not matter to your application whether the rounded number is a floating point number or an integer, these nodes would not be required. In hindsight, it occurs to me that one Math.Floor node could have been placed after the If node.
  8. The If node in Area 8 determines whether to use the result of the nodes in Areas 4 - 7 or Areas 3 - 6 - 7, based on whether Area 5 evalutes to true or false. If true, then the fractional part was exactly 0.5, and the rounded up value from Areas 3 - 6 - 7 is used. Otherwise, the rounded value from Areas 4 - 7 is used. This value will be rounded up for fractional values greater than 0.5 and down for fractional values less than 0.5.

December 25, 2017

Dynamo: Selecting All Curtain Walls

An opportunity to use Dynamo to create a string with which to tag Curtain Walls came up in a thread in the AUGI Revit Architecture - Families Forum. The first task for the Dynamo graph is to select all of the Curtain Walls in the Autodesk® Revit® project file. The All Elements of Category node, in combination with the Categories node, is the usual method for selecting all objects of a particular category in a project file, but there is no Curtain Walls category; you have to choose Walls as the category, and you get all of the Walls, including Basic Walls, Curtain Walls and Stacked Walls.

Thanks to the Filtering / Selecting Curtain walls thread in the Dynamo Forum, in particular, the third post by thread initiator Aseem Deshpande, I was able to use a modified version of what was shown in that post to generate a list of just Curtain Walls from the list of all Walls. (The code posted by Aseem Deshpande sought to remove the Curtain Walls, leaving only "opaque" Walls.) I too had used the Element.Parameter node to examine the available parameters and noted that the Family parameter held the information I needed to determine if a Wall was a Curtain Wall. Unfortunately, I also found that the Element.GetParameterValueByName node was returning the Type name, rather than the value of the Family parameter. The nodes in the post provide a way to make use of the Family parameter value to determine if a particular Wall is a Curtain Wall.

In the image below, the list of all Walls generated by the nodes in the image above, is fed to both the Element.Parameters node and the List.FilterByBoolMask node.
The Element.Parameters node takes the list of all Walls and creates a list of lists; each sub-list contains a list of the parameters attached to each Wall. The Parameter.Name node takes the list of lists of parameters and converts each parameter object to a string of the parameter name. That list of lists of parameter names is then fed to the List.FirstIndexOf node, which outputs a list of the index of the first occurrence of the string "Family" in each sub-list.

The List.GetItemAtIndex node takes the list of parameters lists and the list of indexes of the Family parameter to create a list of the Family parameters. The String from Object node converts each item on that list from a parameter and its value to a string. A code block then tests each string to see if it is equal to "Family : Curtain Wall", which is the value that will be present for Curtain Walls; the output is a list of True or False values, True representing Curtain Walls and False representing Basic or Stacked Walls. This list of Booleans is used as the mask input to the List.FilterByBoolMask node, and is applied to the list of all Walls. That node generates two lists, the "in" list contains all the "Trues", or Curtain Walls, and the "out" list contains all the "Falses". The "in" list is what I needed for the balance of that graph, a list of all of the Curtain Walls in the Revit project.

December 19, 2017

Downloading Autodesk Software

My go-to for downloading Autodesk software from the Autodesk site, the Autodesk Virtual Agent, has been retired, and if you go to that URL, you will, for the next forty-two days or so, find something that looks like this (with a reduced countdown time):

The good news is that the same functionality is still available, through AVA, the "new" Autodesk Virtual Agent. AVA is not really new; she has been around for some time now, answering general questions. What is new is now AVA can provide the download links that the old Virtual Agent provided. If you click on the "Launch AVA Now" link, you will be taken to AVA, pre-set for downloading. If you manage a number of users and find yourself frequently downloading installation files from the Autodesk site, bookmark that link. Or, you can go to the main link to AVA, and type in download as your first response to get Download A Product to show on the right side.

November 30, 2017

ACA: Column Bubble "Leader" Object Types

I ran into some display issues with the anchors that connect Column Bubbles to a Column Grid, and discovered that there are two different object types that can be involved, depending upon how the labels were generated. It took me a while to sort all of that out, so I thought I would document it here for my own future reference as well as to share it with others.

If you create the labels by selecting a Column Grid and use the ColumnGridLabel command, or a Custom Column Grid and use the CustomColumnGridLabelAdd command, the anchor objects will be Anchor Bubble to Column Grid objects. If you use the Column Bubble tool (such as the one on the out-of-the-box Annotation tool palette), the anchor objects will be Anchor Lead Entity to Node objects.

If you use a mix of these, any display changes will have to be applied to both object types to have them display the same way.

November 26, 2017

ACA: Curved Mass Elements - Part 1: FacetDev and FacetMax

A thread in the AutoCAD® Architecture Forum last month brought to my attention that I have not yet addressed how AutoCAD Architecture handles "curved" Mass Elements. "Curved" is in quotation marks because AutoCAD Architecture does not display Mass Elements with true curves, but instead will approximate curves with a series of straight-line segments (2D) or facets (3D).
In the image above, a Mass Element Cylinder with a radius of 10'-0" and a height of 5'-0" has been placed, with FacetDev set to 10'-0" to make the facets obvious.

Two settings control the number of segments that are generated, FacetDev and FacetMax:
  • FacetDev is the allowable deviation of a facet from the true curve, and represents the maximum distance allowed from the midpoint of a facet, perpendicular to the true curve. Larger values will generate fewer facets. Smaller values will generate more facets. A full circle will never have less than eight segments, as seen in the image above. FacetDev must be a positive (non-zero, non-negative) value. Note: If imperial architectural units are set current, the command line will show the current value as a linear distance in those units (feet and inches), the value you enter needs to be a real number, without any feet or inchese symbols. For example, to set a value of 1'-0", type 12 and press the ENTER key.
  • FacetMax sets a maximum number of facets for a single curve. For designs that feature curves with a wide range of radii, FacetMax allows setting FacetDev to a sufficiently small number to achieve a reasonable smoothness on the smaller radii without imposing a serious performance hit due to the large number of segments on the larger radii, which would look smooth with larger FacetDev value. Valid values for FacetMax are integers between 100 and 10000, inclusive.
In the image below, I changed the Visual Style from Conceptual (used in previous image) and I set DISPSILH to 0, so that the lines between facets on the curved surface will show (rather than just displaying the silhouette), viewing the same Mass Element Cylinder as in the previous image. On the left side, FACETDEV remains set to 120 (or 10'-0"). On the right, FACETDEV has been set to 0.5 (or 1/2"). The first value is high enough to result in the minimum 8 facets. The second number results in a much higher number of facets, and is closer to a smooth curve.

With DISPSILH reset back to 1, the image below shows the same cylinder in the 2D Wireframe (left) and Conceptual (right) Visual Styles.

October 31, 2017

ACA: Start Tab and New Drawing Files

This most likely applies to "plain" AutoCAD® and all verticals built on AutoCAD. The Start tab has been there for quite a few releases so far, but somehow I only figured the following out recently, so I thought I would document it here for anyone else who is unaware of it. I almost always start AutoCAD® Architecture from a desktop shortcut, and then start and leave open a blank, new drawing ("Drawing1"). This is an old habit - many releases back, settings would get lost if you closed the program in a "zero-doc" state (no open drawings), so I got in the habit of leaving the initial drawing that opened when starting the program from a shortcut (before the New/Start tab was added), as I like to save and close my working files manually, rather than relying on the program to prompt me to save any unsaved files if I were to close the program with working files open. (I have a lot of little habits like that - otherwise, I am perfectly normal.)

Anyway, now that the Start tab is there on startup, I usually create a new file from my default template, and had been using the Templates drop-down list to choose a template.
Here at home, the list of templates is pretty long, but the last template used has the initial highlight, making it semi-easy for me to select it again most of the time. At work, the list is much shorter, making it even easier to get the right one. I had been doing that for years, until I discovered that the Start Drawing rectangular area just above the Templates drop-down list is not just pretty graphics - it is a giant button, and will start a new drawing with the template assigned as the QNEW template in the Options dialog for the current AutoCAD Profile. That is the template I use for Drawing1 99.99% of the time anyway, so now I can save at least three to four seconds and a click every time I start the program by clicking on that button instead of using the drop-down list.

PS. Yes, I see the notification that I have three product updates. I checked, and they are for various versions of Revit®. I promise to download and install them soon.

October 21, 2017

ACA: Using AutoLISP to Change the Heights of All Doors of a Given Style

There was a request in the AutoCAD® Architecture Forum for a script or customization that could change the heights of all Doors of a specific style to 5'-2". I decided that would be an interesting challenge, and decided to see if I could come up with an AutoLISP® function that would to just that. The exact style name was not given, and I may not have had a style of that name, anyway, so I decided to set up my test file with several instances of the out-of-the-box Bifold - Single Door Style, along with some other Doors.

The routine first gets all of the Doors in the drawing file. If none are found, an alert message is displayed, and the function terminates. If Doors are found, the function iterates over that selection set of all Doors, one Door at a time, looking for Doors of the Bifold - Single Door Style. When one is found, its Height property is changed to 62.0. When all of the Doors have been examined, the program reports that it is complete and lets the user know how many Doors had their height set to 62.0, of the total number of Doors. The routine does not check to see if the height is already 62.0, so it will report the total number of Bifold - Single Doors as being processed. If it were important to report on the number of Doors that actually were changed, the current height could be obtained and compared against the desired height, and any Doors that were already set to the desired height could be skipped.
(defun C:DRHT (                         ; No arguments.
                iCount                  ; Loop counter [integer].
                iMax                    ; Total number of Doors in file [integer].
                iProc                   ; Number of Doors processed [integer].
                objDoor                 ; Door object being processed.
                ss1                     ; All Doors in the file [selection set].
                sStyleName              ; Style name of Door being processed [string].
              ) ;_ End arguments and local variables.
  (setq        ss1 (ssget "_X" '((0 . "AEC_DOOR"))))
    ((not ss1)                          ; No Doors in drawing.
     (alert "Drawing file has no Door objects.\nNothing to do!")
    ) ;_ End condition A1.
    (T                                  ; Else, continue.
     (setq iMax          (sslength ss1)
           iCount 0
           iProc  0
     ) ;_ End setq.
     (while (< iCount iMax)
       (setq objDoor    (vlax-ename->vla-object (ssname ss1 iCount))
             sStyleName (vlax-get-property objDoor 'StyleName)
       ) ;_ End setq.
       (if (= sStyleName "Bifold - Single")
           (vlax-put-property objDoor 'Height 62.0)
           (setq iProc (1+ iProc))
         ) ;_ End progn.
       ) ;_ End if.
       (setq icount (1+ icount))
     ) ;_ End while.
    ) ;_ End condition A2.
  ) ;_ End cond A.
      "\nDRHT function completed:  "
      (itoa iProc)
      " Door(s) of "
      (itoa iCount)
      " total Door(s) processed. "
    ) ;_ End strcat.
  ) ;_ End prompt.
) ;_ End C:DRHT.

Change the (if (= sStyleName "Bifold - Single") line, replacing "Bifold - Single" with the name of the Door Style you want to operate on (enclosed in double quotes). Change the (vlax-put-property objDoor 'Height 62.0) line, replacing 62.0 with a real number representing the desired Door Height in whatever your current linear drawing unit is (inches, millimeters, etc.). The code could also be modified to remove the Style Name test, if you wanted to reset the heights of all Doors in a project to a specific height.

September 24, 2017

Autodesk Answer Days

The next Autodesk® Answer Day will be on October 5, 2017, from 6:00 am to 6:00 pm U.S. Pacific Time. Autodesk team members will be scouring the AutoCAD, AutoCAD Civil 3D, Revit, Inventor, Vault, Maya and 3ds Max forums.

This event will also take place in the following German-language forums, on October 5, 2017, from 10:00am to 5:00pm Central Europe Time: 3ds Max - Deutsch, AutoCAD Produktfamilie - Deutsch, EAGLE - Deutsch, Fusion 360 - Deutsch, Inventor - Deutsch, Maya - Deutsch, Revit - Deutsch.

Read more about the event here and mark your calendar.

August 11, 2017

Multiple Plug-ins Ribbon Tabs...

...instead of one Add-ins ribbon tab, in AutoCAD® Architecture 2018. I found this Autodesk Knowledge Network article on the topic, indicating it was for AutoCAD® Map 3D, 2014/2015, but also applying to AutoCAD® and other verticals, for the 2014, 2015, 2016 and 2017 releases. The instructions worked just fine in AutoCAD Architecture 2018.

As noted, I did not need to do Steps 2, 3 and 4, but I did check to see that was all in place prior to proceeding with the balance of the steps. After unloading the partial customization files for the two plug-ins that I had installed and then closing and restarting the program, the individual panels for the plug-ins showed up on a single Add-ins tab. I did have to turn on the display of the Add-ins ribbon tab, but that was easily done by right-clicking on a blank area of the ribbon and choosing Show Tabs > Add-ins from the context menu.

Oddly, it all came in on one Add-ins tab for AutoCAD® MEP 2018, on the same machine.