tag:blogger.com,1999:blog-93158802024-03-14T12:55:19.066-04:00The Architect's DesktopHarnessing the Power of Autodesk AEC ProductsDavid Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.comBlogger570125tag:blogger.com,1999:blog-9315880.post-92195455249455552372022-04-05T14:54:00.004-04:002022-04-05T14:54:54.240-04:00ACA: Deployment for ACA 2022 - Cannot Remove Custom ProfileFinally had some time to start preparing for the creation of a deployment for AutoCAD Architecture 2022. This is the first deployment for an AutoCAD-based product that I will be creating on the new, web-based system, as we typically only deploy every other year. I worked my way through the limited options under Customizations and came to the last section, <b>Custom Profile</b>. We have multiple custom profiles, one for each discipline, and did not try to include those in the deployment previously. I wanted to see if more than one could be added. I exported profiles to two test ARG files, and added one of them, then tried to add the other.
<br><br>
I quickly found that you can only add one; attempting to add another replaces the first one with the second one. All well and fine; all of the text related to custom profile is singular. What prompted this blog post, as a note to my future self, is the fact that there does not appear to be a way to remove a custom profile once you add one. So it looks like I will be trashing what I have done so far and starting over.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-53231934341150299992022-03-08T17:44:00.001-05:002022-10-05T08:19:40.599-04:00Revit: BIM 360 Model Synchronization ErrorA user had a curious synchronization error today, on a model hosted on our BIM 360 hub. He emailed me the screen shot below.
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgWS2J1oaGjPpBJP4fJbl_Cjvyddk1eQiegBkoH0LnyQyFhQzyXUSw96Nall1cpKyRY5kNTDv04NL53jljCb_wqQUuePpPDwWkvwrYGIkBqAOr8l9Z7fqX3VewIrcJA9aioP4j4gjM-yKuyNyekIggP-36tZQSy3Fn0Wx8r0u_7BtA8WZzX3W4=s464" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="431" data-original-width="464" src="https://blogger.googleusercontent.com/img/a/AVvXsEgWS2J1oaGjPpBJP4fJbl_Cjvyddk1eQiegBkoH0LnyQyFhQzyXUSw96Nall1cpKyRY5kNTDv04NL53jljCb_wqQUuePpPDwWkvwrYGIkBqAOr8l9Z7fqX3VewIrcJA9aioP4j4gjM-yKuyNyekIggP-36tZQSy3Fn0Wx8r0u_7BtA8WZzX3W4=s320"/></a></div>
<br>
I did not know what to make of this - of course the <b><i>[insert ridiculously long GUID here]</i>.rvt</b> file already exists! That is the file he was synchronizing, and had been synchronizing successfully all day, up to that point. And why ask the apparently rhetorical question, "Do you want to replace the existing file?", when there is no opportunity to respond to it? I was perfectly willing to trash the backup versions, as we have not had need to try to pull backups from someone's local cache on a BIM 360 project. (And thank goodness for that, as it is a royal pain just figuring out which <b><i>[insert ridiculously long GUID here]</i>.rvt</b> file is which.) A quick Google search did not generate any useful leads on how to proceed.
<br>
<br>
I walked over to the indivudual's workstation, repeated the error for myself and got lucky. After dismissing the failed Sync With Central dialog, Revit displayed the ever-popular "You have not saved your model recently" nag dialog. Before I could utter the snarky thought that immediately came to mind, I chose to click on Save. I got another dialog, with the same question about losing backup versions, but this one had Yes and No buttons. I said, yes, save it, and it did. Then I tried to synchronize again, half expecting that Revit would tell me the local was now incompatible with the central, but it synchronized just fine, resolving the crisis.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-82589333760491743262022-03-01T12:28:00.003-05:002022-03-01T12:28:00.153-05:00Dynamo: Pin All Revit LinksI have been setting up projects that have a larger than usual number of Revit links in them, and to save myself the bother of having to remember to pin each one after placement (and the bigger bother of repeatedly checking to make sure I did not miss one), I created a graph to pin all of the Revit links in the current model. The graph is rather simple, if you have the Orchid package installed and can use the <b>Element.Pin</b> node contained therein. I was using Revit 2020; those using other Revit versions will likely need a different version of the Orchid package.
<br><br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgoMX0WqjgiCN50Y5uHnholShyxu9KZVEbRuSMIeMenzTepxvJDAOtckEunkOrwVZYUmsJ6nAqECJGOqGVcaBswMoXAbgyOWouwA-QWswm8qZhP2wTNZaSZ-fY6oqoFlAZA-tQReGU5jTU5d11cSKmB8lHhz9E10oQW4QajrM3Zj0b36iI9xC4=s830" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="246" data-original-width="830" src="https://blogger.googleusercontent.com/img/a/AVvXsEgoMX0WqjgiCN50Y5uHnholShyxu9KZVEbRuSMIeMenzTepxvJDAOtckEunkOrwVZYUmsJ6nAqECJGOqGVcaBswMoXAbgyOWouwA-QWswm8qZhP2wTNZaSZ-fY6oqoFlAZA-tQReGU5jTU5d11cSKmB8lHhz9E10oQW4QajrM3Zj0b36iI9xC4=s320"/></a></div>
<br><br>
This runs nicely in Dynamo Player. No need to select the Edit Inputs tool, as there are no inputs to edit.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-26664280599156015532022-02-02T18:12:00.001-05:002022-02-02T18:12:00.155-05:00Revit: Controlling the Initial Open/Close State of Worksets When Opening A Model with the Specify Worksets OptionApologies for the wordy title on this post, but I want to be absolutely clear that I am NOT talking about how to make the Specify option the default option
when opening a Revit model (that is covered in
<a
href="https://knowledge.autodesk.com/support/revit/troubleshooting/caas/sfdcarticles/sfdcarticles/How-to-get-the-Specify-Workset-prompt-to-appear-each-time-a-cloud-workshared-model-is-opened-within-Revit.html#:~:text=Set%20default%20worksets%20to%20be%20opened&text=Open%20the%20model%20in%20Revit,option%20for%20Open%20Workset%20Default."
target="_blank"
>this Autodesk Knowledge Network article</a
>). I am talking about the open/close state of each Workset in the Opening Worksets dialog once the "Specify" option is used (either by default, or because you chose <b>Specify</b> by selecting the button with the downward pointing triangle icon to the right of the <b>Open</b> button in the Open dialog).<br><br>
All credit for this goes to <b>MZ1987</b>, who posted this procedure
<a
href="https://forums.autodesk.com/t5/revit-architecture-forum/opening-worksets-dialog-why-do-some-default-to-open-and-others/m-p/9754842#M297477"
target="_blank"
>here</a
>. I am documenting it in my blog to make it easier for me to find in the
future.<br><br>
<ol>
<li>
Open the model with Specify.
</li>
<li>
In the Opening Worksets dialog, select all user-created Worksets and choose the <b>Open</b> button. The values in the Opened column should all be <b>Yes</b>.
</li>
<li>
After the model opens, open the Worksets dialog. Select all of the user-created worksets and select the <b>Editable</b> button. Set the Open/Close state of each Workset to the way you want it to default in the Opening Worksets dialog. [This is the key step.]
</li>
<li>
Synchronize the model, using the <b>Synchronize and Modify Settings</b> option, NOT <b>Synchronize Now</b>. In the Synchronize with Central dialog, make certain that the User-created Worksets toggle is checked.
</li>
</ol>
Close the model. The next time you, or anyone else, opens the model, they should see each user-created Workset defaulting to the Open/Close state chosen in Step 3. I have not yet experimented with this extensively, since my current goal was to get all Worksets set to <b>Yes</b>. It probably does not matter what the Open/Close state is on opening, just that you make the user-created Worksets editable and then set the desired state at that time, before synchronizing and relinquishing the user-created Worksets. I expect those settings will hold until the next time someone makes an entire Workset editable and also changes the Open/Close state of that Workset, and then synchronizes. So you may have to repeat this when that happens; we typically just borrow elements, rather than make an entire workset editable, so I do not see that being a major issue for my firm.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-75053995395475929692021-11-10T12:37:00.001-05:002021-11-10T12:37:00.150-05:00Autodesk Docs/BIM 360 Default HubSince I provide support to all Revit projects in our office, I am a member of all of the projects hosted on BIM 360. Most of these are on my firm's hub, but we have a number of joint-venture projects or projects where we are a consultant where the project is hosted on another firm's hub. I have long been annoyed that Autodesk has not provided a means to designate a default hub; they seem to set the one that is first alphabetically as the default most of the time, and that is not my firm's hub. It is particularly frustrating when I am in the web portal, on a project on my firm's hub, when Autodesk magically decides I need to sign in again (usually after a period of inactivity, of an apparently random amount of time, but not always) and, after doing so, it not only does not return me to the page I was on, but punts me off onto another firm's hub.
<br><br>
I am not alone in that frustration. I was amused to see one firm recently change the name of their hub, adding an exclamation point ("<b>!</b>") to the front of the name, so that their hub would be first alphabetically. I noticed because suddenly their hub was the new default hub. I suppose now there will be hub naming wars, as everyone else changes their hub's name to get it to sort at the top of the list.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipRTBCSgdlXYIjey87_-4hCitRQ8WNYVAy2wvZRGYiBe8F0IlPb9IqD01r1ncb-pXCsi0Mx0MMxYu9DCBCYX7VYva05w6oozxP_lMJjcv2XjXqEXSAHvFeJuxUZ8NYpKg_0J5K4Q/s328/01_BIM360HubList.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="320" data-original-height="328" data-original-width="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipRTBCSgdlXYIjey87_-4hCitRQ8WNYVAy2wvZRGYiBe8F0IlPb9IqD01r1ncb-pXCsi0Mx0MMxYu9DCBCYX7VYva05w6oozxP_lMJjcv2XjXqEXSAHvFeJuxUZ8NYpKg_0J5K4Q/s320/01_BIM360HubList.png"/></a></div>
<br>
I suppose I should be happy that the renaming did not break my access to that hub.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-82050758366964956702021-08-26T18:39:00.151-04:002021-08-26T18:39:00.183-04:00Revit: Level Name in Use - But It Is NotWe create new projects from a set of "prototype project" model files, one for each discipline, that are already set up with worksharing and standard worksets and are cross-linked to each other. Models are opened detached from central and then saved to the project folders as central models and the links are reloaded from the project-specific models.<br><br>
There are six levels in (most) of the prototype models, and the levels in the other models are monitoring the levels in the architectural model, since the architects usually go first. Provided they move/rename the levels in the starter file, it only requires a Coordination Review to get the other discipline models to match the architectural model. (Some projects have more levels, which then need to be added manually.)<br><br>
I was setting up the other models for a project in which the architectural model was already created, and the process above worked as expected until I got to the structural model. The architects had renamed <b>ROOF</b> to <b>PENTHOUSE ROOF</b> and <b>LEVEL 4</b> to <b>ROOF</b>. For reasons I did not understand, the Coordination Review renamed <b>ROOF</b> to <b>PENTHOUS</b>, but I was able to change the name and get the monitoring straightened out. The problem was it refused to rename <b>LEVEL 4</b> to <b>ROOF</b>. I thought may be it was an order of operations thing at first - maybe it was trying to rename <b>LEVEL 4</b> before it renamed <b>ROOF</b>. But even after I got the <b>PENTHOUSE ROOF</b> level renamed correctly, it still would not rename <b>LEVEL 4</b> to <b>ROOF</b>, even when doing it manually.<br><br>
Revit kept claiming that the name <b>ROOF</b> was already in use. We have a Level Schedule in our files, to make checking the names and elevations of levels in a file easy, without worrying about whether a given level's extents will make it show in a given elevation or section - there was no level named <b>ROOF</b> there. I opened Dynamo, and added the Level node, which allows you to select a level, and it did not offer a level named <b>ROOF</b> in the drop-down. I synchronized, closed and reopened the file, hoping that might shake some phantom memory of the old <b>ROOF</b> level out of its system, with no success.<br><br>
Then it dawned on me that when I renamed the old <b>ROOF</b> level to <b>PENTHOUSE ROOF</b>, it asked me if I wanted to rename views. I clicked on No*, so there was a plan view associated with the <b>PENTHOUSE ROOF</b> level called <b>ROOF</b>. I wondered if that was the reason why Revit would not let me rename <b>LEVEL 4</b> to <b>ROOF</b>. I was going to rename the views eventually, so I did that and then tried to rename <b>LEVEL 4</b> one more time. It worked! So it was the fact that there was still a view associated with the <b>PENTHOUSE ROOF</b> level that still had the old level name as the view name that prevented reusing that old name for a different level. I am writing this here in the hope that the next time I run into this, I will have a vague memory of having the issue before, and will search my blog to see how I solved it.<br><br>
* - I almost never let Revit rename plan views when the name of the associated level is changed. That only changes view names where the entire view name is the level name, and we have many plan views in most models that have the level name in the view name, with additional text. Those will not get changed; I find it easier to use the Dynamo graph I wrote to search for a given string in view names and replace it with a different string when none of the views have had the name changed.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-5189408810058445512021-03-22T19:02:00.003-04:002021-03-22T19:02:07.375-04:00ACA: Using AutoLISP to Change the Swing of all Swinging DoorsThere was a request to change the "swing angle" of all of the Doors in a file to 30 degrees. Building on <a href="http://architects-desktop.blogspot.com/2017/10/aca-using-autolisp-to-change-heights-of.html" target="_blank">code I previously wrote for changing the heights of Doors a given style</a>, I put together a command function in AutoLISP that does that. One thing to know before embarking on this particular task is that while all of <a href="http://architects-desktop.blogspot.com/2006/05/retrieving-door-type-of-door-style-2.html" target="_blank">the 20 built-in Door Types</a> appear to have a <b>SwingAngle</b> property (I did not check all 20, so do not hold me to that), only five of those types (Single, Double, Double Opposing, Uneven and Uneven Opposing) will accept a change to that property; the other 15 types will throw an error and crash the routine. There are four additional types (Single-Dhung, Double-Dhung, Uneven-Dhung and Communicating) that are in fact swinging Doors, but for some reason were not included when the SwingAngle property was introduced. (See comments at the end of the article for more on that.) The "swing" of these types can be changed using the <b>OpenPercent</b> property; a value of 16 approximates 30 degrees. No change is made to the other 11 types of Doors.
<br><br>
The following code defines a command called DRSW that will change the "swing" of Doors of one of the nine types previously mentioned to 30 degrees/16 percent. That amount is hard-coded, on the assumption that this would be part of a larger automation task meant to run unattended (or that you always wanted the same degree/percent values). Collecting user input would be easy enough to add at the beginning if you want to specify the angle/percent each time you run the program.
<pre style="BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: #666666 1px solid; WIDTH: 550px; PADDING-TOP: 6px; BORDER-BOTTOM: #666666 1px solid; HEIGHT: 500px"><span style="font-size:90%;">(defun C:DRSW ( ; No arguments.
/
iCount ; Loop counter [integer].
iDType ; Door Type [integer].
iMax ; Total number of Doors in file [integer].
iProc ; Number of Doors processed [integer].
objDoor ; Door object being processed.
objDStyle ; Door Style of the object being processed.
ss1 ; All Doors in the file [selection set].
) ;_ End arguments and local variables.
(vl-load-com)
(setq ss1 (ssget "_X" '((0 . "AEC_DOOR"))))
(cond
((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))
objDStyle (vlax-get-property objDoor 'Style)
iDType (vlax-get-property objDStyle 'Type)
) ;_ End setq.
(if (or
(= iDType 1) ; Single.
(= iDType 2) ; Double.
(= iDType 5) ; Double Opposing.
(= iDType 6) ; Uneven.
(= iDType 8) ; Uneven Opposing.
) ;_ End or.
(progn
(vlax-put-property objDoor 'SwingAngle 30)
(setq iProc (1+ iProc))
) ;_ End progn.
(if (or
(= iDType 3) ; Single-Dhung.
(= iDType 4) ; Double-Dhung.
(= iDType 7) ; Uneven-Dhung.
(= iDType 20) ; Communicating.
) ;_ End or.
(progn
(vlax-put-property objDoor 'OpenPercent 16)
(setq iProc (1+ iProc))
) ;_ End progn.
) ;_ End if.
) ;_ End if.
(setq iCount (1+ iCount))
) ;_ End while.
) ;_ End condition A2.
) ;_ End cond A.
(prompt
(strcat
"\nDRSW function completed: "
(itoa iProc)
" Door(s) of "
(itoa iCount)
" total Door(s) processed. "
) ;_ End strcat.
) ;_ End prompt.
(prin1)
) ;_ End C:DRSW.</span></pre>
<br>
Originally, all Door Types controlled how open they appeared using the <b>Opening percent</b> property on the Properties palette (or its prior equivalent). 100% open for a swinging door meant a 180-degree swing. So a 90-degree swing would be 50%. Some users complained that may make sense to a programmer, but they thought of door swings in terms of degrees, not percentages. So at some point (I do not recall which release), a <b>SwingAngle</b> property was added to Door objects, and, for the five Door types noted above, <b>Swing angle</b> replaced <b>Opening percent</b> on the Properties palette. For those five Door types, the two values are linked - change one and the other changes, too. (That is how I determined that 16% was the right value for 30 degrees - that is the value for OpenPercent that the program shows when the SwingAngle is set to 30.) I have no idea why the three Dhung and the Communicating Door Types were omitted from the change to SwingAngle. Perhaps the original complainants rarely, if ever, used those types and so they were not in the original request. Or maybe the way things were set up in the program, it was easy to make the change for the five types that were changed, but not for the other four. Whatever the reason, things are the way they are, and the code above accommodates that.
David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com1tag:blogger.com,1999:blog-9315880.post-2813823876055784782021-03-02T23:23:00.005-05:002021-03-02T23:23:00.445-05:00AutoCAD: No Fill on Polylines With WidthNote to self on the things to check when Polylines with width are unfilled:
<ul>
<li>Check the current Visual Style. The <b>2D Wireframe</b> Visual Style supports filled polylines; the <b>Wireframe</b> Visual Style does not. Other Visual Styles either do not support fill (such as <b>Hidden</b> or <b>Sketchy</b>), or will dim the fill (such as <b>Shaded with Edges</b> or <b>Xray</b>).
</li>
<li>Check your view direction. You will also need to know the plane in which the Polyline with width was drawn. For fill to display, the view direction needs to be perpendicular to the Polyline's plane. Set the current UCS so that the X-Y plane is the plane in which the Polyline was drawn, and then set the view direction to Top. Many times someone inadvertantly drags the View Cube ever so slightly away from "Top". It may be hard to tell from the View Cube or the drawing contents (no obvious forshortening), but if you look at the UCS icon, you will see an indication of the Z axis and if you look at the in-canvas controls at the upper left corner of the drawing canvas, the middle control will say <b>Custom View</b> instead of <b>Top</b>. Reset the view direction to <b>Top</b>.
</li>
<li>Check the setting of <b>FILLMODE</b>. If it is set to 0, reset it to 1. (To save keystrokes, you can also use the <b>FILL</b> command - turn fill <b>On</b>.) You will likely have to do a REGEN after changing the value to see the change on screen.
</li>
</ul>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-43788518409895992142021-02-28T19:56:00.000-05:002021-02-28T19:56:26.230-05:00AMEP: Plumbing Line "Label" with a LeaderA question came up the other day, concerning Plumbing Lines and the "Label Curves" that AutoCAD MEP provides to label those Plumbing Lines. The request was to be able to be able to label a short Plumbing Line - one shorter than the label itself - by offsetting the label and connecting the label back to the Plumbing Line with a leader.
<br><br>
The results of some quick research suggested that Label Curves do not have a leader option, when offset from the Plumbing Line that they are labeling. I am not sure if there is some inherent limitation here, or it just was never part of the specification for the object. They certainly have many useful features, like masking the Pluming Line, if desired, and repeating at a specified distance or a specified number of times - but no leader.
<br><br>
It occurred to me that, for the stated case of a short Plumbing Line, that the masking and repeating features were not necessary, and that a Schedule Tag, which can have an integral leader, could be created that looks just like the Label Curve, if the data displayed by the Label Curve was available in Property Data. It turns out that, at least for the <b>Standard - Pipe With System Label</b> Label Style, which shows the <b>Object Props. and Abbr. System Name</b>, Plumbing Lines have corresponding Automatic Property sources: Nominal Size and Abbreviation. I was able to create a Property Set Definition that applies to Plumbing Lines and includes three properties:
<ul>
<li><b>Abbreviation</b>, created from the Abbreviation automatic property source. The <b>Case - Upper</b> Property Data Format was applied to this property.
</li>
<li><b>NominalSize</b>, created from the Nominal Size automatic property source. Since I was working in imperial units (it is one of my habits), I applied the <b>Number - Fractional</b> Property Data Format to this property.
</li>
<li><b>LineLabel</b>, a formula property, creates the string that is to be displayed in the Schedule Tag. It is a simple concatenation of the text equivalent of the NominalSize property, an inches symbol [via Chr(034)], a space and the Abbreviation property. The <b>Standard</b> Property Data Format was applied to this property.
</li>
</ul>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeXs1qYUllQBrTzXUldrhjT_mCj_leJ-ZRYANKQ1v5gp06R1eXI3dcbDebT0L_gDsZEh0MWlCaawAEioREMCsYSeSJQL6nXEJRV9evw_ppHX54F-LLPGTHGSjcP3P3thEjVDeCQ/s1302/01_StyleManager_PropertySetDefinition_PlumbingLineObjects_Definition.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="741" data-original-width="1302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeXs1qYUllQBrTzXUldrhjT_mCj_leJ-ZRYANKQ1v5gp06R1eXI3dcbDebT0L_gDsZEh0MWlCaawAEioREMCsYSeSJQL6nXEJRV9evw_ppHX54F-LLPGTHGSjcP3P3thEjVDeCQ/s320/01_StyleManager_PropertySetDefinition_PlumbingLineObjects_Definition.png"/></a></div>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7jzK7KcXCbO_lClrA1fZdYOOcIXxgrXFzf9Vbv9gAIj95-azPoN-ZLlI646PSh4Po0NXO6ErnJLAkngqi9j8wotWa6y95kt3NWlQkPm1dYchDasuLOLieN7m9iRxVFbZhdYR-Ng/s665/02_StyleManager_FormulaPropertyDefinition_LineLabel.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="627" data-original-width="665" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7jzK7KcXCbO_lClrA1fZdYOOcIXxgrXFzf9Vbv9gAIj95-azPoN-ZLlI646PSh4Po0NXO6ErnJLAkngqi9j8wotWa6y95kt3NWlQkPm1dYchDasuLOLieN7m9iRxVFbZhdYR-Ng/s320/02_StyleManager_FormulaPropertyDefinition_LineLabel.png"/></a></div>
<br>
A Schedule Tag can then be created to display the value in the LineLabel property, a Schedule Tag tool can be created for that Schedule Tag, the tool properties can be edited to include a leader and then the tool can be used to place a tag with a leader. The result can be seen in the image below, where the short Plumbing Line segment has both an offset Label Curve and a Schedule Tag with a leader, so you can compare the two.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvWnkTcFNFKQWI1pTP9VlD4lH5epQ7CVE4v1MzeNOV6wHzqCm3nu66pXnA6xoyBJM93u9EoBom9vz8TsguxFqFkUTjUVQMNoL3pqXfb8C5YsLRhiGRX1l9D7GrLZ_lkoaHhKtLg/s1044/03_PlumbingLinesWithLabelCurvesAndScheduleTagWithLeader.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="461" data-original-width="1044" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvWnkTcFNFKQWI1pTP9VlD4lH5epQ7CVE4v1MzeNOV6wHzqCm3nu66pXnA6xoyBJM93u9EoBom9vz8TsguxFqFkUTjUVQMNoL3pqXfb8C5YsLRhiGRX1l9D7GrLZ_lkoaHhKtLg/s320/03_PlumbingLinesWithLabelCurvesAndScheduleTagWithLeader.png"/></a></div>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-29867103748519241712021-01-28T17:47:00.004-05:002021-01-28T17:47:01.228-05:00Revit: Tip When Making the Transition from Network to Named User LicensesHere is something of which I wish I was aware prior to the change over from network to named-user licenses. If all of your users were already set up with BIM 360 Design licenses (which were always named-user) and were always signed into Revit with their Autodesk Account, then this will not be an issue for you. But if you have users that are not signed into Autodesk Account when using Revit under a network license, chances are that their default Revit user names are not the same as the Username on their Autodesk Accounts. Make certain everyone synchronizes and relinquishes all object ownership in all Revit models while still using a network license BEFORE you change them to named user.
<br><br>
Once on named user, your users have to be signed in, and their Revit user names will be "locked" as the Usernames associated with their Autodesk Account. If that differs from their previous user names, they will not be able to synchronize their old local files, nor will they be able to create a new local under their old user names so that they can relinquish ownership of objects.
<br><br>
The users may be able to copy/paste unsynchronized changes, and the central file can be opened detached and then a new central file can be created from the detached copy to get rid of ownership issues (once everyone who can synchronize/relinquish does so), but nobody really wants to do any of that.
<br><br>
You might think no one would ever close Revit having only saved changes locally, or without relinquishing all ownership, but you would be wrong. I have already run into this twice.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-66937329776415200322021-01-24T00:38:00.007-05:002021-01-24T00:39:56.045-05:00Network Licenses, Options File, Adding Users to a GroupNot sure I really need to record this knowledge for the future, since we will soon be out of the Autodesk network license business completely. All but 30 of our network licenses made the jump to named-user licenses last Thursday. Perhaps I will post something about that experience, once the dust settles and my anger subsides. Returning to the subject of this post, I needed, for the first time, to set up an options file to limit access to those remaining 30 licenses for those running Revit 2016, since the 2016 (and older) releases of Autodesk software have to be uninstalled and reinstalled to change the license type. In my opinion, that is too much work for something that will no longer be "of right" licensed in two or three months. But we do have a few active projects in Revit 2016 that the project teams do not want to upgrade (or do not want to upgrade at this point in time, due to imminent deadlines). The problem is we were not able to convert everyone over to named user licenses for 2017 and later versions before the end of the grace period, and the unconverted users were taking all of the licenses.
<br><br>
What I discovered this evening/this morning is that when specifying the user names for the group I was creating in the options file, you do NOT include the "@" and the computer name as part of the user name. I had always seen users being reported with their Windows login name followed by "@" and then the name of the computer on which they were running the software that was asking for the license, so I foolishly assumed that was how the user name should be specified. But when I reread the license with the new options file in place, I was not able to get a license myself, and someone who had a license checked out who was on the list was also denied. I panicked, and put back the old options file. I looked at the instructions again, and noticed that the examples only had a user name, without any machine designation. I then added my user name, without a machine name in addition to my user name with a machine name, reread the license, and I was able to get a license. Then I removed my user name with the machine name, and it still worked. Adding the other user with out the machine name allowed that license to also be checked out, convincing me that was the correct approach. So now all users that I want to include have the"@" and machine name removed, and I am fairly confident that will work. I guess I will see Monday morning.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-47126179774247542362020-12-04T22:50:00.004-05:002020-12-04T22:50:38.582-05:00Revit: Text Parameter Value Driven by Four or More Yes/No ParametersRegarding <a href="http://architects-desktop.blogspot.com/2020/12/revit-text-parameter-value-driven-by.html">my last post</a>, I would be remiss if I did not point out that FAIR59 also replied, with a more elegant solution that is also easier to expand to 5, 6 or more parameters. <a href="https://forums.autodesk.com/t5/revit-architecture-forum/revit-multiple-if-conditions-with-4-parameters/m-p/9901016#M305251">Check out that post here</a>.
David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-91441200891376092542020-12-01T05:27:00.112-05:002020-12-01T05:27:04.387-05:00Revit: Text Parameter Value Driven by Four Yes/No ParametersI came across an interesting request in the Autodesk Revit Architecture forum the other day. The person wanted to have four Yes/No parameters (called <b>A</b>, <b>B</b>, <b>C</b> and <b>D</b>) determine the value of a text parameter (called <b>TEXT</b>), based on the following conditions:
<ol>
<li>If two or more of the four Yes/No parameters are checked, the value of <b>TEXT</b> is to be "SELECT ANY ONE".
</li>
<li>If none of the four Yes/No parameters are checked, the value of <b>TEXT</b> is to be "NO TEXT".
</li>
<li>If only the <b>A</b> parameter is checked, the value of <b>TEXT</b> is to be "A".
</li>
<li>If only the <b>B</b> parameter is checked, the value of <b>TEXT</b> is to be "B".
</li>
<li>If only the <b>C</b> parameter is checked, the value of <b>TEXT</b> is to be "C".
</li>
<li>If only the <b>D</b> parameter is checked, the value of <b>TEXT</b> is to be "D".
</li>
</ol>
<br>
The solution I devised uses a series of nested if statements to work through all of the possibilities. The condition of the first if statement is an <b>or</b>. Each item in the <b>or</b> is an <b>and</b> of a pair of the Yes/No parameters. There is an <b>and</b> for each possible combination of the four Yes/No parameters. If both items in at least one of the combinations of Yes/No parameters is true, then the entire <b>or</b> evaluates to true. That takes care of all of the situations where two or more of the Yes/No parameters are checked, and "SELECT ANY ONE" is returned.
<br><br>
The else of the first condition then launches a series of if statements that tests whether a given Yes/No parameter is checked, starting with <b>A</b>. If <b>A</b> is checked, "A" is returned; if not, another if statement tests for a check in <b>B</b>. If <b>B</b> is checked, "B" is returned, and so on through to <b>D</b>. If <b>D</b> is checked, "D" is returned; if not, "NO TEXT" is returned.
<br><br>
Here is the formula:
<pre style="BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: #666666 1px solid; WIDTH: 550px; PADDING-TOP: 6px; BORDER-BOTTOM: #666666 1px solid; HEIGHT: 40px"><span style="font-size:90%;">if(or(and(A, B), and(A, C), and(A, D), and(B, C), and(B, D), and(C, D)), "SELECT ANY ONE", if(A, "A", if(B, "B", if(C, "C", if(D, "D", "NO TEXT")))))</span></pre>
<br>
And a screen capture:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrxI6mqxBE_Sdwi2RnTQKGZiqkkP3R3a4IRXObHOGIgohyDlecY-ZxTcgnsVsn_zaKyT6BNMrom5iyW_t27hLjrb2aPa0bkKY8m8wKQowX7OjSVSZH7t6iMgY83k0M7yC6_wplOg/s1027/01_Revit2021_FourYesNoParametersDriveValueOfTextParameter.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="549" data-original-width="1027" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrxI6mqxBE_Sdwi2RnTQKGZiqkkP3R3a4IRXObHOGIgohyDlecY-ZxTcgnsVsn_zaKyT6BNMrom5iyW_t27hLjrb2aPa0bkKY8m8wKQowX7OjSVSZH7t6iMgY83k0M7yC6_wplOg/s320/01_Revit2021_FourYesNoParametersDriveValueOfTextParameter.png"/></a></div>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com1tag:blogger.com,1999:blog-9315880.post-67348241064590882932020-11-25T22:07:00.000-05:002020-11-25T22:07:09.887-05:00Revit: Extracting Level Names in DynamoA few weeks back, I had a request to be able to filter a Door Schedule by the Level to which the Doors in the project were associated. That is a choice if you are only scheduling Doors in the current model, but is not an option if your Schedule includes Doors in linked models. I suggested that a Dyanmo graph could be created that would read the Level of each Door and write the Level name to a separate parameter, which could then be used for filtering. The graph would need to be run in each of the models, and, if there are later changes that add more Doors, re-run. Pretty standard stuff for a Dynamo graph.
<br><br>
There is just one problem with that - the built-in Revit parameter <b>Level</b> does not return just the name of the Level, but instead returns what is shown in the image below.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTeeBM_e-tX9ZNWLRRjWnuxWq2R3XZDQQDoTm1O-8554_r1Huad_nK8eNyIy6ptMgtNs7XsQkDvIOqF9s_wtrrhMMuFyGUTmlCbGkccuzQLoFgwQKh2TKX-37ZY11f71fPK5cFDQ/s621/01_ValuesOfRevitLevelParameter.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="381" data-original-width="621" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTeeBM_e-tX9ZNWLRRjWnuxWq2R3XZDQQDoTm1O-8554_r1Huad_nK8eNyIy6ptMgtNs7XsQkDvIOqF9s_wtrrhMMuFyGUTmlCbGkccuzQLoFgwQKh2TKX-37ZY11f71fPK5cFDQ/s320/01_ValuesOfRevitLevelParameter.png"/></a></div>
<br>
I ran those results through the <b>String from Object</b> node to be certain the values were seen as strings. (I suppose I should try it without that node to see if it is really necessary, but I have not done so yet.) It may be possible to extract the level name for each item on the list using a series of nodes, or perhaps some code in a code block, but the amateur programmer in me wanted to work out how to do so in Python, and it turned out be be quite simple, using string slicing. The start index of the Level name is one more than the index of the equals sign ("=") and the end index of the slice is the index of the comma. A simple <b>for</b> loop processes each item in the list and appends it to the result list. The image below shows the code.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS90JuhtdQysAiFVpqAerUM76BWvrSU3zpQWYDrzjf_A_poUaxSYqEqSNhH7NWPjYnSFBMQklNBxQMX-MDGwWvlOGBWiLpeY1dM8lSt3QZ2Jg5mg2QY6JRtsBLS0Rj7RA0YmvsDg/s586/02_DynamoGraph_PythonScriptToExtractLevelName.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="493" data-original-width="586" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS90JuhtdQysAiFVpqAerUM76BWvrSU3zpQWYDrzjf_A_poUaxSYqEqSNhH7NWPjYnSFBMQklNBxQMX-MDGwWvlOGBWiLpeY1dM8lSt3QZ2Jg5mg2QY6JRtsBLS0Rj7RA0YmvsDg/s320/02_DynamoGraph_PythonScriptToExtractLevelName.png"/></a></div>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com1tag:blogger.com,1999:blog-9315880.post-49153429538144237442020-10-27T12:19:00.002-04:002020-10-27T12:19:04.436-04:00Autodesk Extends Previous Version AccessIn case you missed <a href="https://customersuccess.autodesk.com/articles/expanding-previous-version-access-to-5-versions-back-for-all-customers" target="_blank">this announcement</a>, starting on November 2, 2020, subscription and maintenance customers will have access to the current version and the <b>five</b> most-recent prior versions. Currently, access is limited to the current version and three prior versions.
<br><br>
Technical support will continue to only be provided for the current version and three prior versions. But for large projects, as well as for those medium to small projects that just never seem to end, this may allow you to avoid having to upgrade files to a newer version due to the original authoring version no longer being available.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-77736827481323931882020-07-31T19:45:00.000-04:002020-07-31T19:45:00.110-04:00Emojis in File NamesFile this one under, "Just because you can, does not mean you should."
<br /><br />
A colleague had called my attention to the fact that, in Windows 10, you are allowed to use emojis in file names. (Press the Window key + . to call up a dialog that allows you to select one.) I was pretty sure AutoCAD would have a problem with that, but I was surprised to find that I was able to create a file called 🍕.dwg and AutoCAD had no problems with it.
<div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ZCG7lZSeaEnv6U83m1PT0cTJoKZQu8moQ_Y7pW6N1sp_c7Kxo5fLxef1mVoDK2QQS14JZOJBjlbV2eMxH1zkXggaz039FhGSFcpz9NE-9nbzERQzq-NKWMBo0VFgVxD8f20ORQ/s902/01_FileExplorer_Pizza-dot-dwg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="256" data-original-width="902" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5ZCG7lZSeaEnv6U83m1PT0cTJoKZQu8moQ_Y7pW6N1sp_c7Kxo5fLxef1mVoDK2QQS14JZOJBjlbV2eMxH1zkXggaz039FhGSFcpz9NE-9nbzERQzq-NKWMBo0VFgVxD8f20ORQ/s640/01_FileExplorer_Pizza-dot-dwg.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHQtm7HYEXzw65lhNOsi8_6eTiPhCI374UqS3p_0TGzz3WymFY1rFtlH5J10x7_fQ-WJN9dVJjXRw7_Mt-RhL1zwNNG8QDgTmLJGQtgSTFzYLRzbALvkQN3qt90OEaq_kw3gyyg/s657/02_ACA2020_Pizza-dot-dwg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="657" data-original-width="624" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHQtm7HYEXzw65lhNOsi8_6eTiPhCI374UqS3p_0TGzz3WymFY1rFtlH5J10x7_fQ-WJN9dVJjXRw7_Mt-RhL1zwNNG8QDgTmLJGQtgSTFzYLRzbALvkQN3qt90OEaq_kw3gyyg/s640/02_ACA2020_Pizza-dot-dwg.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><br /></div></div>
I do not recommend doing this with project files. I will also note that I did nothing beyond creating the file. I have not fully tested this. For example, I did not see what happens if I try to externally reference this file, or even just inserting it as a block into another file.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com1tag:blogger.com,1999:blog-9315880.post-52177006619867301672020-07-10T21:09:00.000-04:002020-07-10T21:09:40.800-04:00Dynamo: Building User Options into a GraphThe goal of the graph on which I was working when I needed to know <a href="http://architects-desktop.blogspot.com/2020/07/dynamo-other-parameter-group.html">how to add Shared Parameters to the Other Parameter Group</a> was to allow a user to easily add additional shared parameters that we use to track issued Sheets in our Drawing List Schedule. Our template files have the first ten of these in them, and for some projects, that is enough. Others have many more than ten issuances, particularly those that track issuances during the design phases. We have twenty additional Shared Parameters in our Shared Parameter file; adding more than one of them is tedious, at best.
<br><br>
Using the <b>Parameter.AddSharedParameter</b> node from Erik Falck Jørgensen's <a href="https://erfajo.blogspot.com/">Orchid</a> package makes it easy to bulk-add Shared Parameters in a Dynamo graph. For this particular task, however, I wanted to be able to offer the end user the choice of adding the second group of ten parameters, the third group of ten parameters or both the second and third groups of ten parameters, without creating separate graphs for each group of ten additional parameters, and without the user having to go into the graph and make adjustments.
My solution was to use a <b>Python Script node</b> to handle the user options. Two separate lists of the Shared Parameter names are created, and two Boolean nodes with <b>Is Inupt</b> set allow the user to choose to include one or both of those lists when the graph is run. The <b>Python Script node</b> has four inputs; two for the lists (IN[0] and IN[2]) and two for the Boolean nodes (IN[1] and IN[3]). The image below shows the simple Python code that gathers the input values and then tests the Boolean values, adding the associated list of Shared Parameter names to the output list if the Boolean is set to True.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNnZkwVffLlZSBGfQg_-Fe5M6wjVBNxoOg1BDbzZeIKa4ZCiR78Nqi8B6Oxfu0v2YMdJg9OSo4mpJAmzIpgFv8Iare3moXDOrYyLCnNfKth-j0mH00CMpYdpGEaqhacTtBB5cXQQ/s1600/01_PythonScript_PythonCode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNnZkwVffLlZSBGfQg_-Fe5M6wjVBNxoOg1BDbzZeIKa4ZCiR78Nqi8B6Oxfu0v2YMdJg9OSo4mpJAmzIpgFv8Iare3moXDOrYyLCnNfKth-j0mH00CMpYdpGEaqhacTtBB5cXQQ/s320/01_PythonScript_PythonCode.png" width="320" height="291" data-original-width="576" data-original-height="523" /></a></div>
<br>
In Dynamo Player, when the user finds the graph file and selects the Edit Inputs tool, this is what she or he sees:
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsh4f9M66YfY0CuBoWjaS-45zGqyqIz4MJPemOoGLLvgDQYAzVB30kN_ksV6Jun2oiyN8IR6CG7KN545cYaApH4HtwAfXL7f3bAFuIhtbFiTYZybzYgSBzK6Pltx_KGsesHzgVSg/s1600/02_DynamoPlayer_EditInputs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsh4f9M66YfY0CuBoWjaS-45zGqyqIz4MJPemOoGLLvgDQYAzVB30kN_ksV6Jun2oiyN8IR6CG7KN545cYaApH4HtwAfXL7f3bAFuIhtbFiTYZybzYgSBzK6Pltx_KGsesHzgVSg/s320/02_DynamoPlayer_EditInputs.png" width="320" height="312" data-original-width="477" data-original-height="465" /></a></div>
Both Booleans are intially set to False. Should the user run the graph with both set to False, the Parameter List result will display the string to which the listOut variable is set if the list is empty: "Select at least one set of Parameters to add. " The user only needs to click on the "switch" displayed for each "Add Issues" Boolean to toggle it to <b>True</b>.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUoJP0VlCNYFygezLcDhVkMpMaM5oQf4vGUbeDCCsgZ6FuftPW0bFKIQk3hsudOURyaNIBTmbm0HIwKEEbIxpqvli89qP144COC_-hzHyrOS6c35BYoAwk_TcGUEVrGDrCx2xOw/s1600/03_DynamoPlayer_SetBooleanTrue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUoJP0VlCNYFygezLcDhVkMpMaM5oQf4vGUbeDCCsgZ6FuftPW0bFKIQk3hsudOURyaNIBTmbm0HIwKEEbIxpqvli89qP144COC_-hzHyrOS6c35BYoAwk_TcGUEVrGDrCx2xOw/s320/03_DynamoPlayer_SetBooleanTrue.png" width="320" height="312" data-original-width="477" data-original-height="465" /></a></div>
<br>
The switch turns green when set to True. Once the desired list(s) are set to True, selecting the Play tool will run the graph and the selected Shared Parameters will be added to the active project. The Parameter List result will display a list of the names of the Shared Parameters that were added.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIUKcWecNHBmFQtXzspaTm_sgNzsIfXAQwMtTg-RFfg33KpH3psBUajSOWTeWALkUGX9tq1AGozgdXxvvND9V3RymQBOu6lQF0Eacb70kAJipJIgs0Os17CIwTW3C6Nw_dldUutg/s1600/04_DynamoPlayer_RunCompleted.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIUKcWecNHBmFQtXzspaTm_sgNzsIfXAQwMtTg-RFfg33KpH3psBUajSOWTeWALkUGX9tq1AGozgdXxvvND9V3RymQBOu6lQF0Eacb70kAJipJIgs0Os17CIwTW3C6Nw_dldUutg/s320/04_DynamoPlayer_RunCompleted.png" width="239" height="320" data-original-width="477" data-original-height="639" /></a></div>
<br>
As always, you can select an image to see it full size.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-87041232303064938442020-07-02T12:38:00.000-04:002020-07-02T12:38:00.136-04:00Dynamo: Other Parameter GroupLong time, no post. If anyone is still reading this blog, I hope you and your families are doing well in these trying times. A combination of being busy with work (remotely) and not having anything about which to write caused this rather long gap between posts.
<br><br>
I came across something today that I wanted to document for future reference. I was working on a Dynamo graph to automate the adding of specific shared parameters as project parameters in a Revit project file, using the <b>Parameter.AddSharedParameter</b> node from Erik Falck Jørgensen's <a href="https://erfajo.blogspot.com/">Orchid package</a>.
<br><br>
One of the required inputs is the Group under which the parameter will be organized. The particular parameters with which I was dealing are a continuation of ten that we already have in our project template files, and they are located under the <b>"Other"</b> group. The Select BuiltIn Parameter Group node that ships with Dynamo is used to generate the needed value, but <b>PG_OTHER</b> is not on the list from which you select. The first item on the list, <b>INVALID</b>, might not seem like something you would want to select, but in this case, that is the correct choice, to have the parameters created placed under the <b>Other</b> category.
<br>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLhrwFfnOGxIiw6-42eDgVTE9_L4LX8yq-RqF-Bkln5zQp3WOETQ9pLdC6RW2mFcflh-UQ2OXUTVDggpU3Cx51P5Jq76Jlrr5zR-MbkGSxVWlgoMuIjcO_ENTrmcwRroXtr2ss5g/s1600/01_SelectBuiltInParameterGroupNode_List.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLhrwFfnOGxIiw6-42eDgVTE9_L4LX8yq-RqF-Bkln5zQp3WOETQ9pLdC6RW2mFcflh-UQ2OXUTVDggpU3Cx51P5Jq76Jlrr5zR-MbkGSxVWlgoMuIjcO_ENTrmcwRroXtr2ss5g/s320/01_SelectBuiltInParameterGroupNode_List.png" width="320" height="271" data-original-width="529" data-original-height="448" /></a></div>
<br>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQGPffrbQz9gojbcH768SLPBZ3vQvu3WbkiHobnZt9Hqo4ZeKO4HZbQcOqKqQlBXUoFv5y0MKXz6BEf4ZDzmoeXOe_nchEBRpC05Z18jyA7jsuVRfloJkxW9-Szy_ymAABBmn0A/s1600/02_SelectBuiltInParameterGroupNode_Invalid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQGPffrbQz9gojbcH768SLPBZ3vQvu3WbkiHobnZt9Hqo4ZeKO4HZbQcOqKqQlBXUoFv5y0MKXz6BEf4ZDzmoeXOe_nchEBRpC05Z18jyA7jsuVRfloJkxW9-Szy_ymAABBmn0A/s320/02_SelectBuiltInParameterGroupNode_Invalid.png" width="320" height="96" data-original-width="261" data-original-height="78" /></a></div>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-45495473560053073832020-03-01T21:20:00.000-05:002020-03-01T21:20:54.310-05:00ACA: Sheet Keynote SymbolsThe out-of-the-box Sheet Keynote symbol in the US Imperial content features a hexagonal "tag" (not a Schedule Tag, but a Block-type Multileader that has a User Block assigned to it).
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiK7d76GMeAJn84_HTNhnXiaDNACIi00kkwUIZe85L0tFhtifvd-j-zx6COKn_UseHcMPngIUjmnb00nS7j7K_Cl-3ek4fSaPavNP6ZBFBvrR3Hq3CO8rsPlt82xHpUDyD_mszMQ/s1600/01_ToolPalettes_Document_Annotation_SheetKeynoteTool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiK7d76GMeAJn84_HTNhnXiaDNACIi00kkwUIZe85L0tFhtifvd-j-zx6COKn_UseHcMPngIUjmnb00nS7j7K_Cl-3ek4fSaPavNP6ZBFBvrR3Hq3CO8rsPlt82xHpUDyD_mszMQ/s320/01_ToolPalettes_Document_Annotation_SheetKeynoteTool.png" width="152" height="320" data-original-width="406" data-original-height="852" /></a></div>
If your office standard is to use a differently shaped symbol, for whatever reason, that can be done; just follow the instructions that follow.
<ol>
<li>You will need a non-annotative block to serve as the User Block of the Multi-Leader. The block will need to have a non-annotative Attribute Definition to hold the Sheet Keynote value, along with whatever other graphics you need. The Multileader that gets inserted can be annotative, if so specified in the Multileader Style; the User Block needs to be set up such that 1" in the Block Definition will end up plotting at the AutoCAD Architecture Annotation Plot Size when plotted for the active annotation scale assigned to the Multileader. Assuming that you want the Sheet Keynote text to plot at the Annotation Plot Size, it needs to be 1" high. Size the additional graphics to suit.
</li>
<li>The Attribute Definition's default value needs to be set up with a Field, that is set to show the Sheet Key value (only), as shown in the image below. Set the Field category to <b>AEC Keynotes</b>, the Field names to <b>Sheet Key only</b>, the Format to <b>Uppercase</b> and check the <b>Insert as a placeholder</b> toggle. Your field expression should look like what is shown in the image.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_HygS73q5Xf1TgmkBah1EhQjH0YhDxa1HygfyI2YB8sE2DtLlvZa0it3QXI4e1ayy9im86T9r5f9JZtM0qMXYUMZO9BqMHncqetUNUcx3HujsLE-wqBaxiKgPhAWiRfAit8Q0g/s1600/02_EditAttributeDefinition_DefaultField_FieldDialog_FieldForSheetKeynoteAttributeDefinition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_HygS73q5Xf1TgmkBah1EhQjH0YhDxa1HygfyI2YB8sE2DtLlvZa0it3QXI4e1ayy9im86T9r5f9JZtM0qMXYUMZO9BqMHncqetUNUcx3HujsLE-wqBaxiKgPhAWiRfAit8Q0g/s320/02_EditAttributeDefinition_DefaultField_FieldDialog_FieldForSheetKeynoteAttributeDefinition.png" width="320" height="168" data-original-width="1470" data-original-height="770" /></a></div>
</li>
<li>You will need a Block-type Multileader Style that has the leader set up the way you want for your Sheet Keynotes. The Multileader Style can be set up to use your User Block, if you like; even if you do not, the settings in the Tool Palette tool that will be created to insert the Sheet Keynote will take care of setting your block as the User Block.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmksFOWCLVZ5EO1-jbn0seA5KpKkLqwlurFS96FUgQXzf_gxlx83GRMF2_D2ws8V_IaguMyYbEZhgi4gtVgm-xsJInDOqCUwQwpDwJFFjmkuIKnBF4qm0BRoDuXsYYjlBBPLhuyA/s1600/03_ModifyMultileaderStyle_ContentTab_MultileaderType_Block.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmksFOWCLVZ5EO1-jbn0seA5KpKkLqwlurFS96FUgQXzf_gxlx83GRMF2_D2ws8V_IaguMyYbEZhgi4gtVgm-xsJInDOqCUwQwpDwJFFjmkuIKnBF4qm0BRoDuXsYYjlBBPLhuyA/s320/03_ModifyMultileaderStyle_ContentTab_MultileaderType_Block.png" width="320" height="276" data-original-width="891" data-original-height="769" /></a></div>
</li>
<li>You can make the process of creating the block definition with the required Field easier, by placing an instance of the out-of-the-box Sheet Keynote in the file where you are going to create the Block Definition. For the US Imperial content, that will bring in the SheetKey_Hexagon_na Block Definition. Insert an instance of this Block Definition, select it, right click and choose <b>Copy Block Definition and Assign</b> from the context menu. Enter a new name for your block. Now edit the block in place. Keep the Attribute Definition as is, and edit the hexagonal Polyline, or erase it and replace it with your own graphics. Inserting an instance of the out-of-the-box Sheet Keynote will also bring in the Block (Straight Leader) Multileader Style (US Imperial content). If you like that leader style, use it. If not, make your own or rename the Block (Straight Leader) Multileader Style and then edit it to create the leader you want. Keep the type set to Block.
</li>
<li>Save the file that contains your Block Definition and Multileader Style in a location that will be accessible to everyone who will need to make use of the Tool Palette tool that will reference this content. A shared network location is ideal for this, but you can also set it up on a local drive if everyone has the same location.
</li>
<li>Create a Sheet Keynote type Tool Palette tool for your content, on an editable Tool Palette. You can either copy the out-of-the-box tool and edit its properties, or add a copy of the one called Sheet Keynote in the Stock Tool Catalog > Drafting Tools. NOTE: Setting up an editable tool palette, and then sharing it with others is beyond the scope of this article. Perhaps I should write about that in the future.
</li>
<li>Right click on the Sheet Keynote tool, and choose Properties from the context menu. Edit the tool's properties to suit your needs. Give the tool a meaningful <b>Name</b>, that clearly indicates that this is your Sheet Keynote tool. You can include an extended description in the <b>Description</b> property; this will be shown in the tool tip when a user hovers over the tool. To have the tool use your content, set the <b>Multileader style location</b> and <b>Symbol location</b> properties to the path/file that holds your content, and then choose your content using the drop-downs in the <b>Multileader style</b> and <b>Symbol</b> properties. Verify that the <b>Content type</b> property is set to <b>Block</b>. Set any other properties as you prefer.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xZVp4t6CaCY2ZE4syORqC5dnFxaCAymXnaUg0gWI_e2ifCW5Aw7UhJrCmfxL9-I9GQvlKb28ry8TQMx7RzwfyoWInKaLjXsvFHIA2koEXowltQLr9OkrLwpHYLRKHnwvzmAAIQ/s1600/04_ToolPaletteToolProperties_CircleSheetKeynote.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xZVp4t6CaCY2ZE4syORqC5dnFxaCAymXnaUg0gWI_e2ifCW5Aw7UhJrCmfxL9-I9GQvlKb28ry8TQMx7RzwfyoWInKaLjXsvFHIA2koEXowltQLr9OkrLwpHYLRKHnwvzmAAIQ/s320/04_ToolPaletteToolProperties_CircleSheetKeynote.png" width="242" height="320" data-original-width="643" data-original-height="849" /></a></div>
</li>
<li>Select the <b>OK</b> button to ratify the changes you made to the tool's properties.
</li>
<li>Start a new drawing, and test the new tool by selecting it, and verify that it places your Sheet Keynote Multileader correctly. Make any adjustments to the content or the tool properties as needed. If you do not have any AEC Content in the file from which a Sheet Keynote can pull the Keynote reference, you can press the ENTER key when prompted to select an object, and then manually choose a Keynote in the Select Keynote dialog.
</li>
<li>Place several Sheet Keynote symbols in your file, then use the out-of-the-box Document > Annotation > <b>Sheet Keynote Legend</b> tool, selecting your Sheet Keynotes, to verify that they show in the legend.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmh5fBKMbv3hFllvX9rGgpK8iLrPDtjK9j9FJr-CLb8_4IoNJmBkYkR1gyav7SAOXoIOrA0DyHwZKASuE048L1NqVnm2yfJbSI0YZajCtG4DPgzw7AWrGWoMvoOGdtPhD_yci0Mw/s1600/05_SheetKeynoteTable_TestNotes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmh5fBKMbv3hFllvX9rGgpK8iLrPDtjK9j9FJr-CLb8_4IoNJmBkYkR1gyav7SAOXoIOrA0DyHwZKASuE048L1NqVnm2yfJbSI0YZajCtG4DPgzw7AWrGWoMvoOGdtPhD_yci0Mw/s320/05_SheetKeynoteTable_TestNotes.png" width="320" height="222" data-original-width="836" data-original-height="580" /></a></div>
</li>
</ol>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-478096056607845862020-02-01T22:09:00.002-05:002020-02-01T22:24:57.172-05:00ACA: Property for Area of a Hatch ObjectA question regarding tagging Hatch objects and being able to display the area of the hatch arose the other day. My initial response was, sure, that should not be a problem in AutoCAD<sup><span style="font-size:78%;">®</span></sup> Architecture. Upon actually trying to do that, I found that there is no Area Automatic Property for Hatches. While that seems like an oversight, I then checked the object properties of Hatches and found that there is an Area property that is available through ActiveX. That is, no doubt, what drives the Area property of Hatches in the Properties palette. So while it was not quite as easy as I originally thought, it is possible to do, by creating a Formula Property that extracts the Area of the Hatch object to which the Property's Property Set is attached. Here is how to do that:
<br><br>
<ol>
<li>Open the Style Manager, and create a Property Set Definition that applies to Hatch objects. I called mine <b>HatchObjects</b> (demonstrating my incredible creativity), and will use that name in the balance of this article. If you already have a Property Set that applies to Hatch Objects, you can add the required properties to it. If you name yours differently, substitute your name for <i>HatchObjects</i> wherever you see it here.
</li>
<li>In the HatchObjects Property Set Definition, create an Automatic Property that references the Handle Automatic Property source, if one does not already exist. Select the <b>Add Automatic Property Definition</b> tool on the Definition tab of the HatchObjects Property Set Definition (second from the top, at the left side of the tab, with the lightning bolt icon). Select the toggle to the right of the Hatch source to put a check mark in it, then select the <b>OK</b> button. I chose to leave the name of the property at the default value of <b>Handle</b>.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqcZLZTh-l7VWyB56x7qT5kzKvzdpSxrHkgCx95LORRaj-PgSbTthglKnqtT6bnqAwS_Uggj53N_01EEhkMEHtNQ3JRELEvkIc7aYAKuJxL58GCKMN5aN0n_en3ceqHKqCN7lCFg/s1600/01_AutomaticPropertySource_Hatch_Handle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqcZLZTh-l7VWyB56x7qT5kzKvzdpSxrHkgCx95LORRaj-PgSbTthglKnqtT6bnqAwS_Uggj53N_01EEhkMEHtNQ3JRELEvkIc7aYAKuJxL58GCKMN5aN0n_en3ceqHKqCN7lCFg/s320/01_AutomaticPropertySource_Hatch_Handle.png" width="232" height="320" data-original-width="458" data-original-height="633" /></a></div>
</li>
<li>In the HatchObjects Property Set Definition, create a Formula Property.
</li>
<li>Enter a name for the property in the Name edit box at the top; I used <b>HatchArea</b> (creativity gone wild).
</li>
<li>Uncheck the Use formula for description toggle (unless you really want the formula to be the description; I almost never do).
</li>
<li>Enter the formula in the Formula edit box. If you like, you can cut and paste the formula from the code box below. Note that the [Handle] text has to be a properly created reference to the Handle Property created in Step 2. That is done by selecting it in the Insert Property Definitions pane in the lower left corner of the Formula Property Definition dialog. You can substitute that for the pasted text, or you can follow the instructions in <a href="http://architects-desktop.blogspot.com/2007/07/blog-post.html">this blog article</a>, if you like.
<pre style="BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: #666666 1px solid; WIDTH: 550px; PADDING-TOP: 6px; BORDER-BOTTOM: #666666 1px solid; HEIGHT: 55px"><span style="font-size:90%;">Set acadApp = GetObject(,"AutoCAD.Application")
Set hatchObj = acadApp.ActiveDocument.HandleToObject( "[Handle]" )
RESULT = hatchObj.Area / 144.0</span></pre>
When done correctly, the [Handle] text will have a light gray background and will be treated as one item, not individual characters. See image of dialog below.
</li>
<li>The formula is setting the variable acadApp to the AutoCAD Application, and then getting the Hatch Object associated with the value of the Handle property (which is the Hatch Object to which the Property Set is attached). The RESULT of the formula is then set to the value of the Area property of the Hatch, which will be a real number representing the area of the Hatch, in square drawing units. My sample file used imperial units, with one unit equal to one inch. Since I wanted the Area value in square feet, I divided the raw value by 144.0 to get square feet. If you are not using imperial units, or want to show the Area in some other area unit, adjust the RESULT line to do what is necessary to get the area value in the desired units.
</li>
<li>Your Formula Property Definition dialog should look similar to the image below. If so, select the OK button to save the changes to the HatchArea Formula Property.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtqMUan1L4W0ymYMXzF_kWRJmLX0MowqeMIqUHI86J4A4IjArMRuyw5NhsnkUxV4xYTDj7XAGfU7d0T55qzd5k7jTpukkqxallk2QSwTtyzcdN9vJiVj9CJUZKL3gGH-gOp0t3lQ/s1600/02_FormulaPropertyDefinition_HatchArea.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtqMUan1L4W0ymYMXzF_kWRJmLX0MowqeMIqUHI86J4A4IjArMRuyw5NhsnkUxV4xYTDj7XAGfU7d0T55qzd5k7jTpukkqxallk2QSwTtyzcdN9vJiVj9CJUZKL3gGH-gOp0t3lQ/s320/02_FormulaPropertyDefinition_HatchArea.png" width="320" height="269" data-original-width="747" data-original-height="627" /></a></div>
</li>
<li>Back in the Style Manager, on the Definition tab, assign the desired Property Data Format to the newly created Formula Property.
</li>
<li>If you need additional properties for your Hatch Objects, you can add them now. When done, select the OK button to accept the changes made, close the Style Manager and return to editing the drawing.
</li>
<li>Attach the Property Set to one or more Hatches in your file. Select the Hatch and note the value of the Area property (under the Geometry category) on the Design tab of the Properties palette. Then select the Extended Data tab and verify that the value shown matches (allowing for any rounding/formatting of the value by the chosen Property Data Format).
</li>
</ol>
David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-88930414414369074882020-01-09T20:39:00.000-05:002020-01-24T22:25:13.851-05:00Revit: New Ceiling Grid Pattern, Part 3 - Ceiling Type<a href="https://architects-desktop.blogspot.com/2019/12/revit-new-ceiling-grid-pattern-part-1.html">First article in the series.</a>
<br>
<a href="http://architects-desktop.blogspot.com/2020/01/revit-new-ceiling-grid-pattern-part-2.html">Previous article in the series.</a>
<br><br>
In Parts 1 and 2, we created a Fill Pattern to define a grid pattern for an acoustic tile Ceiling, and then set up a Material that uses that Fill Pattern as a Surface Pattern. We will now assign that Material to the finish layer of a Compound Ceiling type.
<br>
<ol>
<li>In the Project Browser, expand the Families node.
</li>
<li>Under the Families node, expand the Ceilings node. Then expand the Compound Ceiling node under that.
</li>
<li>Right click on the 2’ x 2’ ACT Compound Ceiling family type. Choose Duplicate from the context menu. If your project file does not have that type, choose another type used to show a grid-based acoustic tile ceiling.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW0cBH4-LNS2H9MQZ9Y1-EoUuIU1m4gp1Oaff5eDzYpY6sGxSGnFuj7jn5pM9c6AqEi9AxYk7G_Jw4KiR-WJuAD6lQgrxepHxOoyrvTF_-if8HcJZTPw9tL8PMpEpa1Ss4psZx4w/s1600/14_ProjectBrowser_DuplicateCompoundCeilingType.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW0cBH4-LNS2H9MQZ9Y1-EoUuIU1m4gp1Oaff5eDzYpY6sGxSGnFuj7jn5pM9c6AqEi9AxYk7G_Jw4KiR-WJuAD6lQgrxepHxOoyrvTF_-if8HcJZTPw9tL8PMpEpa1Ss4psZx4w/s320/14_ProjectBrowser_DuplicateCompoundCeilingType.png" width="264" height="320" data-original-width="380" data-original-height="460" /></a></div>
</li>
<li>Give the duplicated type a meaningful name. I chose to call the example type <b>4-24x24_1-48x6 ACT System</b>.
</li>
<li>Open a Ceiling Plan view that has an area to receive the new Ceiling Type. If the area does not already have a Ceiling, place one.
</li>
<li>Select the Ceiling, and, in the Properties palette, use the Type Selector at the top to change the selected Ceiling’s type to the newly created type.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWPsYxIvL_CefAjdqE4iM-q7hbs7cllq1I2A4qkco37hlo9LB5qmmXPIUD4j3Ej6VLIC-yLinErv7svTvtYTyq3ACtQkhmQP3DCGwL72XR73bPAyVb5XOExa4b-KsDrszDrCRKTQ/s1600/15_Ceiling_TypeSelector_SetCeilingToNewType.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWPsYxIvL_CefAjdqE4iM-q7hbs7cllq1I2A4qkco37hlo9LB5qmmXPIUD4j3Ej6VLIC-yLinErv7svTvtYTyq3ACtQkhmQP3DCGwL72XR73bPAyVb5XOExa4b-KsDrszDrCRKTQ/s320/15_Ceiling_TypeSelector_SetCeilingToNewType.png" width="320" height="284" data-original-width="861" data-original-height="764" /></a></div>
</li>
<li>With the Ceiling still selected, in the Properties palette, select the <b>Edit Type</b> button.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgThiR6uiXkpjztxyMqYrPk8CmE0UG4IL6YEH7Hx06iyXzTwyW_yfN0t65eMVFFbjpXjtrT3H6Pfau0uwUKmgara0MKu8PaLou9wG9b10Njq7MS8G6h2NNgRXliCest1GPA9gL4gQ/s1600/16_Ceiling_Properties_EditType.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgThiR6uiXkpjztxyMqYrPk8CmE0UG4IL6YEH7Hx06iyXzTwyW_yfN0t65eMVFFbjpXjtrT3H6Pfau0uwUKmgara0MKu8PaLou9wG9b10Njq7MS8G6h2NNgRXliCest1GPA9gL4gQ/s320/16_Ceiling_Properties_EditType.png" width="320" height="284" data-original-width="385" data-original-height="342" /></a></div>
</li>
<li>In the Type Properties dialog, verify that the newly created Ceiling Type name shows in the Type drop-down list. Then select the <b>Edit</b> button to the right of the Structure parameter, under the Construction category.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpcCLAzGI3CT3ExYQMegvRwvHFUZtpvfipQY3BngvYmji0IQLz6wRUol-5t1ADa-usfbQTsdIrmAiYc7x7jN5N9VWi9IU44iA7o5em20o0ZPVM5pk9eY2rPwcGmkj9eRTPwIjjiw/s1600/17_Ceiling_TypeProperties_Structure_Edit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpcCLAzGI3CT3ExYQMegvRwvHFUZtpvfipQY3BngvYmji0IQLz6wRUol-5t1ADa-usfbQTsdIrmAiYc7x7jN5N9VWi9IU44iA7o5em20o0ZPVM5pk9eY2rPwcGmkj9eRTPwIjjiw/s320/17_Ceiling_TypeProperties_Structure_Edit.png" width="320" height="287" data-original-width="662" data-original-height="593" /></a></div>
</li>
<li>In the Edit Assembly dialog, find the Finish 2 [5] layer under Core Boundary (line "4"). If you started with a different Ceiling Type that does not have a Finish 2 [5] layer, use the layer on the bottom, that will be exposed to the room below the Ceiling.
</li>
<li>Left click once in the Material column on the Finish 2 [5] line. This will highlight the name and cause a small button with an ellipsis icon (...) to appear at the right end of the column on that line. Select that button.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYt03MbIBa4eDhh8d7YqAJK9Fi1BhzujoGdzb1RUA1gzfXc6cUrgPNakkDbkGakOFRTKSTPMfZf3amUQki1VMUPsD6bSxLxM28N2Yjj9e2TUyzRf2TsuYqNBsylREOWPwiTVZkVg/s1600/18_Ceiling_TypeProperties_EditAssembly_Finish2_EditMaterial.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYt03MbIBa4eDhh8d7YqAJK9Fi1BhzujoGdzb1RUA1gzfXc6cUrgPNakkDbkGakOFRTKSTPMfZf3amUQki1VMUPsD6bSxLxM28N2Yjj9e2TUyzRf2TsuYqNBsylREOWPwiTVZkVg/s320/18_Ceiling_TypeProperties_EditAssembly_Finish2_EditMaterial.png" width="320" height="287" data-original-width="662" data-original-height="593" /></a></div>
</li>
<li>In the Material Browser, find and select the Material you created in Part 2.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQkdUEDJEZUC6L7iFW87L99dUObMs2IP1CSkZ5qs3hpoey60UqwTZ6GkRC_Qtvhzg99YhRKYJgewxPjJNMGFPc0fhuGjrRj3LZhGe9pPQOJOojHrcfschSqWk3dnzzWF5Suac3bQ/s1600/19_MaterialBrowser_SelectMaterialForFinish2OnNewCeilingType.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQkdUEDJEZUC6L7iFW87L99dUObMs2IP1CSkZ5qs3hpoey60UqwTZ6GkRC_Qtvhzg99YhRKYJgewxPjJNMGFPc0fhuGjrRj3LZhGe9pPQOJOojHrcfschSqWk3dnzzWF5Suac3bQ/s320/19_MaterialBrowser_SelectMaterialForFinish2OnNewCeilingType.png" width="320" height="226" data-original-width="806" data-original-height="568" /></a></div>
</li>
<li>Select the <b>OK</b> button to ratify the choice and dismiss the Material Browser dialog.
</li>
<li>In the Edit Assembly dialog, verify that the new material appears and that the value in the Thickness column for Finish 2 [5] is correct.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz4ghGeZU7a4aB4H_mJrMRshjTsUwr1sGKxGouPXLNLVKGNyOiDboTV9hyt3augPJ-makTOjKAAXZ0Jt7M0Bbl_cZVejI16AjZVe4TsE9vSDz6ezpdqD60sNPrhTpOOlOWgQLIew/s1600/20_Ceiling_TypeProperties_EditAssembly_Finish2_VerifyMaterialAndThickness.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz4ghGeZU7a4aB4H_mJrMRshjTsUwr1sGKxGouPXLNLVKGNyOiDboTV9hyt3augPJ-makTOjKAAXZ0Jt7M0Bbl_cZVejI16AjZVe4TsE9vSDz6ezpdqD60sNPrhTpOOlOWgQLIew/s320/20_Ceiling_TypeProperties_EditAssembly_Finish2_VerifyMaterialAndThickness.png" width="320" height="287" data-original-width="662" data-original-height="593" /></a></div>
</li>
<li>Select the OK button in the Edit Assembly dialog to ratify the change to the material. Then select the <b>OK</b> button again to accept all of the changes to this ceiling type, dismiss the Type Properties dialog and see the effect on the selected ceiling.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qScXiXYCJi0NNqDSYUoTJtQoJAH16eTkwzho8CDNc1M2Jw6N7c65Woj-3sg6amSLnCAhueadiq3O6vK2gz2u6whSR5DIn4XDxF8vbBu4dn2x1oGodSad7fAAS6QPpCD_ECpHNw/s1600/21_NewCeilingGridPattern_OnCeiling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qScXiXYCJi0NNqDSYUoTJtQoJAH16eTkwzho8CDNc1M2Jw6N7c65Woj-3sg6amSLnCAhueadiq3O6vK2gz2u6whSR5DIn4XDxF8vbBu4dn2x1oGodSad7fAAS6QPpCD_ECpHNw/s320/21_NewCeilingGridPattern_OnCeiling.png" width="320" height="242" data-original-width="435" data-original-height="329" /></a></div>
</li>
<li>Synchronize the model to save the changes to the central file.
</li>
</ol>
<br>
If you are using Basic Ceilings, rather than Compound Ceilings, you can still assign the Material created in Part 2. Instead of editing the Structure in the Type Properties dialog, you will assign the Material to the Material parameter under the Materials and Finishes category.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-50202922672754026232020-01-05T21:27:00.000-05:002020-01-24T22:26:21.152-05:00Revit: New Ceiling Grid Pattern, Part 2 - Material<a href="https://architects-desktop.blogspot.com/2019/12/revit-new-ceiling-grid-pattern-part-1.html">First article in the series.</a>
<br><br>
In Part 1, we created a custom Fill Pattern from a PAT file to define the grid pattern for an acoustic tile Ceiling. We will add that pattern to a Material in this article, so that it can then be assigned to the finish layer of a Ceiling in Part 3.
<br>
<ol>
<li>On the Manage ribbon tab, on the Settings panel, select the <b>Materials</b> tool.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIAi3Pe-nnwOocCrmfN2PaXg6zQ6MVmsopbIuyRreWA6mYM6VJD5-oYW4r9UoNAWaDNULqf7ZusiNpkzQ6caf4DW8i7Ho-91qLXLUGdiCTHRNrzpmbHrxjHm4wPmbGz5h5vehgkg/s1600/07_Manage_Settings_Materials.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIAi3Pe-nnwOocCrmfN2PaXg6zQ6MVmsopbIuyRreWA6mYM6VJD5-oYW4r9UoNAWaDNULqf7ZusiNpkzQ6caf4DW8i7Ho-91qLXLUGdiCTHRNrzpmbHrxjHm4wPmbGz5h5vehgkg/s320/07_Manage_Settings_Materials.png" width="320" height="136" data-original-width="735" data-original-height="313" /></a></div>
</li>
<li>For the purposes of this tutorial, all we care about is the Surface Pattern that will be seen in the contract documents, and the rendered appearance will not be adjusted. If that is also true for you, you can proceed by either creating a new Material from scratch or by duplicating one of the ceiling tile Materials and then editing the duplicate. I will take the latter approach here, as that way the new Material will inherit the graphic settings from the source material, maintaining consistency.
</li>
<li>In the Material Browser, find and select the <b>Acoustic Ceiling Tile 24 x 24</b> material, which is part of the content supplied with the United States Imperial content in Revit. If you are working in a Metric file, choose an existing Material for a gridded ceiling.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnJdUMLF2ZQ_QgK-XsTzWMGI81t6SO8VUa5fgC5Q7Fa_qO2VKke80jK7KYfu7gMLSz09tbBwTtoWWJWMirwoxbHSl-x6bmSsaH8J9JzhBzA0gDwuBtnrk5Pe3_GBy8596NKycATA/s1600/08_MaterialBrowser_AcousticCeilingTile24x24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnJdUMLF2ZQ_QgK-XsTzWMGI81t6SO8VUa5fgC5Q7Fa_qO2VKke80jK7KYfu7gMLSz09tbBwTtoWWJWMirwoxbHSl-x6bmSsaH8J9JzhBzA0gDwuBtnrk5Pe3_GBy8596NKycATA/s320/08_MaterialBrowser_AcousticCeilingTile24x24.png" width="320" height="226" data-original-width="806" data-original-height="568" /></a></div>
</li>
<li>Right click on the material, and choose <b>Duplicate</b> from the context menu.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVbXsAKB9Ww1daCZrCjp7QgR2DcIsIcHC4k7N3eNk9nDENR9e6Kjw-8RFEQzi4l7OB-w-R2tO_ttpSkrgAFItZR2mKc0mrLGcLDg4xp5iAHDVczPsWRvTWzjOUHgYwUsllOlGkQg/s1600/09_MaterialBrowser_AcousticCeilingTile24x24_Duplicate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVbXsAKB9Ww1daCZrCjp7QgR2DcIsIcHC4k7N3eNk9nDENR9e6Kjw-8RFEQzi4l7OB-w-R2tO_ttpSkrgAFItZR2mKc0mrLGcLDg4xp5iAHDVczPsWRvTWzjOUHgYwUsllOlGkQg/s320/09_MaterialBrowser_AcousticCeilingTile24x24_Duplicate.png" width="320" height="143" data-original-width="341" data-original-height="152" /></a></div>
</li>
<li>Give the new material a meaningful name. For this example, I chose <b>Acoustic Ceiling Tile 4-24x24_1-48x6</b>.
</li>
<li>Select the Appearance tab. While we will not be setting a grid-specific render image for this Material, we do want to set the Material up with a unique Appearance Asset so that any future change made here will not affect other Materials, and any future change made to the Appearance Asset assigned to the Acoustic Ceiling Tile 24 x 24 Material (or any other Material using the same Appearance Asset) will not affect this Material. In the upper right corner, select the <b>Duplicates this asset.</b> tool. If successful, the name of the Appearance Asset will be changed (by adding a number in parentheses at the end) and the number next to the hand icon will be 0, indicating that this Appearance Asset is shared with no other Material. If you have a render image for this Ceiling, you would assign it here; that is beyond the scope of this tutorial.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnGt9Z7mAL7UJMWwwsX4BNmvC45HyNTVaFhcYyR4e5P3s0aW6EXnlWLPMz76qo8M3hO-psy2GTDYrlW1d57yhtzZXBc5ES-0fdcfrACqMBxMGrJqYEYYyvEdmvC98a2J5o-9cKDQ/s1600/10_MaterialBrowser_Appearance_DuplicateAsset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnGt9Z7mAL7UJMWwwsX4BNmvC45HyNTVaFhcYyR4e5P3s0aW6EXnlWLPMz76qo8M3hO-psy2GTDYrlW1d57yhtzZXBc5ES-0fdcfrACqMBxMGrJqYEYYyvEdmvC98a2J5o-9cKDQ/s320/10_MaterialBrowser_Appearance_DuplicateAsset.png" width="320" height="210" data-original-width="865" data-original-height="568" /></a></div>
</li>
<li>Select the Graphics tab.
</li>
<li>In the Surface Pattern area of the Graphics tab, select the image tile to the right of where it says Pattern.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3PpHmcsETFXagCSqxTtNL1Jz4_YM4oL7NNgyzyUGsbNNqcHjNZgxtn242B3xjF0_4q5fDAG6vKpS8k08Q8eFavTKi_TihrYYWz7Yqhc-vFEFQ4br_XRl__bIuwk6Hx5bPsmTUyg/s1600/11_MaterialBrowser_Graphics_SurfacePattern.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3PpHmcsETFXagCSqxTtNL1Jz4_YM4oL7NNgyzyUGsbNNqcHjNZgxtn242B3xjF0_4q5fDAG6vKpS8k08Q8eFavTKi_TihrYYWz7Yqhc-vFEFQ4br_XRl__bIuwk6Hx5bPsmTUyg/s320/11_MaterialBrowser_Graphics_SurfacePattern.png" width="320" height="163" data-original-width="460" data-original-height="235" /></a></div>
</li>
<li>In the Fill Patterns dialog, verify that the Pattern Type is set to <b>Model</b>. Then find and select the Fill Pattern created in Part 1.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCmlHKJ9WL-DNPgGeD6i_fvK1rdPIlD0mdINi7pvNUXvtcP-LWWY1rEwtxAAom23O98aC0fdwTsKMC07Zr1Jv-m_wxDHWKQIMfOIxEiZVfja9vOSq_YpohbSghTtPDZNoEm_YAvg/s1600/12_FillPatterns_Model_SelectDesiredPattern.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCmlHKJ9WL-DNPgGeD6i_fvK1rdPIlD0mdINi7pvNUXvtcP-LWWY1rEwtxAAom23O98aC0fdwTsKMC07Zr1Jv-m_wxDHWKQIMfOIxEiZVfja9vOSq_YpohbSghTtPDZNoEm_YAvg/s320/12_FillPatterns_Model_SelectDesiredPattern.png" width="241" height="320" data-original-width="338" data-original-height="448" /></a></div>
</li>
<li>Select the <b>OK</b> button to ratify the selection and dismiss the Fill Patterns dialog.
</li>
<li>In the Material Browser dialog, verify that the other settings on the Graphics tab are as desired. Assuming you want this ceiling pattern to appear the same one of the source Material (Acoustic Tile 24 x 24, or whatever Material you duplicated) (except for the Fill Pattern used), the settings should be correct.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc0idAxKoLiWLRr83azF6UyamerLTZCGWvMLvwqgXQqksRcHKh2Eti9Q36NT4HRsvVihKsOGwkoKeHHptFMQCCRrkvlZ6lLjgU_tYj85lBP11rDuhVCroyD_lgdEeZxpHmVGxOPw/s1600/13_MaterialBrowser_ACT4-24x24_1-48x6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc0idAxKoLiWLRr83azF6UyamerLTZCGWvMLvwqgXQqksRcHKh2Eti9Q36NT4HRsvVihKsOGwkoKeHHptFMQCCRrkvlZ6lLjgU_tYj85lBP11rDuhVCroyD_lgdEeZxpHmVGxOPw/s320/13_MaterialBrowser_ACT4-24x24_1-48x6.png" width="320" height="226" data-original-width="806" data-original-height="568" /></a></div>
</li>
<li>Select the <b>OK</b> button to add the new material to your project.
</li>
</ol>
<br>
<a href="http://architects-desktop.blogspot.com/2020/01/revit-new-ceiling-grid-pattern-part-3.html">Part 3</a> will add the new Material to a Ceiling Type.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-71707022533010107312019-12-31T11:23:00.001-05:002020-01-06T21:45:51.000-05:00Revit: New Ceiling Grid Pattern, Part 1 - Fill PatternIn order to have a new ceiling type with a "custom" ceiling grid pattern, you need a Fill Pattern that defines the grid pattern, a Material to which that Fill Pattern can be assigned as a Surface Pattern, and, finally, a Ceiling Type to which that Material can be assigned. While you can start by duplicating a Ceiling Type and drill your way through the various dialogs until you get to the point where you create a new Fill Pattern for the ceiling, and then drill your way back out, I am going to break the process down into three separate steps, so that each step serves as a tutorial for that operation and can be referenced when the need for that operation comes in a different context.
<br><br>
The first step is to create a Fill Pattern that defines the ceiling grid. I am assuming that you have a Fill Pattern file (PAT) that defines a Model type of pattern (as it represents a real-world object, a ceiling grid, that wants to hold the same dimensions, no matter the scale of the view in which it is seen). For the purposes of this example, I am using a custom Fill Pattern that is called <b>Ceiling_4-24x24_1-48x6</b>. It has four rows of 2'-0" x 2'-0" tiles, and then a row of 6" x 4'-0" tiles, as seen in the image below.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQJoV4uzGz73j09vAuGcfDeEt4-ojLq2Hi_XTLAPnox2E1nn2kVAUyyCu41GWA-IZZVMiSczVjupjpqXH46RzoUoIgP1xFpDHt8UQGczCPNZG16AhxP8biPe3e7q8VlJDt7x3zuQ/s1600/01_NewCeilingGridPattern_OnCeiling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQJoV4uzGz73j09vAuGcfDeEt4-ojLq2Hi_XTLAPnox2E1nn2kVAUyyCu41GWA-IZZVMiSczVjupjpqXH46RzoUoIgP1xFpDHt8UQGczCPNZG16AhxP8biPe3e7q8VlJDt7x3zuQ/s320/01_NewCeilingGridPattern_OnCeiling.png" width="320" height="242" data-original-width="435" data-original-height="329" /></a></div>
Here is how to make that PAT file pattern available in Revit, as a Fill Pattern.
<br>
<ol>
<li>On the Manage ribbon tab, on the Settings panel, select the Additional Settings tool to deploy the menu, and then choose <b>Fill Patterns</b> from the menu.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9lswYglt6Hk907GTOZzWH8drJ9bIlpO5v_pWFg0ZkHrsN8biFKnZRQ7in64qpAQFC8eDZcQNee6cEnrm-DICYxjrE7WVbwqOaptLGbqaLrexcpdh3pW2BNhTYfSX0gn_skzgrQ/s1600/02_Manage_Settings_AdditionalSettings_FillPatterns.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_9lswYglt6Hk907GTOZzWH8drJ9bIlpO5v_pWFg0ZkHrsN8biFKnZRQ7in64qpAQFC8eDZcQNee6cEnrm-DICYxjrE7WVbwqOaptLGbqaLrexcpdh3pW2BNhTYfSX0gn_skzgrQ/s320/02_Manage_Settings_AdditionalSettings_FillPatterns.png" width="320" height="249" data-original-width="382" data-original-height="297" /></a></div>
</li>
<li>In the Fill Patterns dialog, set the Pattern Type to <b>Model</b>. Then select the <b>New fill pattern</b> tool.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1It-80QEPWzovEJzq-Fsf9-dbGT1qy46TnM9dB390AYBboKX88QeoMicFyrpW5jUPUOc64ucY53MYBjSjIB8pStpLoZHJ9fKu_g7G9mN5x78T7P_H07kwK95ihYqFxjDKrX0Jpw/s1600/03_FillPatternsDialog_ModelPatternType_NewFillPattern.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1It-80QEPWzovEJzq-Fsf9-dbGT1qy46TnM9dB390AYBboKX88QeoMicFyrpW5jUPUOc64ucY53MYBjSjIB8pStpLoZHJ9fKu_g7G9mN5x78T7P_H07kwK95ihYqFxjDKrX0Jpw/s320/03_FillPatternsDialog_ModelPatternType_NewFillPattern.png" width="241" height="320" data-original-width="338" data-original-height="448" /></a></div>
</li>
<li>In the Add Surface Pattern dialog, set the Type to <b>Custom</b>. Then select the <b>Browse</b> button.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG_BOagZv8lxpmcGCu9Sby7t9evjyjF2YtIyStbrzzM4RHd8N4exvOdjqbycT2jIdeAeXOa5qChijYZnv563mqWjN_2HHEb_h_5iQTvLDmB7CEXX_Jy3urczB9E9N1rnuaI1owaw/s1600/04_AddSurfacePatternDialog_Custom_Browse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG_BOagZv8lxpmcGCu9Sby7t9evjyjF2YtIyStbrzzM4RHd8N4exvOdjqbycT2jIdeAeXOa5qChijYZnv563mqWjN_2HHEb_h_5iQTvLDmB7CEXX_Jy3urczB9E9N1rnuaI1owaw/s320/04_AddSurfacePatternDialog_Custom_Browse.png" width="153" height="320" data-original-width="244" data-original-height="510" /></a></div>
</li>
<li>In the Import Fill Pattern dialog, navigate to the location where you saved the <b>Ceiling_4-24x24_1-48x6.pat</b> file, and select it. Select the <b>Open</b> button.
</li>
<li>Back in the Add Surface Pattern dialog, verify that the Name is what you want (it will default to the pattern name) and the Import scale is set to 1.00 (since this is a model pattern, and the pattern was created at full size). Select the <b>OK</b> button to add the Fill Pattern and dismiss the Add Surface Pattern dialog.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrbJdp7grH-3eWUQx3AkvunIXIx2a1ZNyK1xZ_oZUWCXKiMmX5GvsvZMIOJI_75HCwbLF9m4OT6VC6OFI3NlLEB_kxrQTCi8Z3xKLzZpMCKsKe7bFU2_TlfB6k2pHKx7KSZ_8ZA/s1600/05_AddSurfacePatternDialog_Name_Scale.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsrbJdp7grH-3eWUQx3AkvunIXIx2a1ZNyK1xZ_oZUWCXKiMmX5GvsvZMIOJI_75HCwbLF9m4OT6VC6OFI3NlLEB_kxrQTCi8Z3xKLzZpMCKsKe7bFU2_TlfB6k2pHKx7KSZ_8ZA/s320/05_AddSurfacePatternDialog_Name_Scale.png" width="153" height="320" data-original-width="244" data-original-height="510" /></a></div>
NOTE: This example uses a PAT file that only defines one pattern, so the desired pattern is already selected. If your desired pattern is in a PAT file that defines two or more patterns, then you will need to find and select your pattern in the list box to the left of the Browse button. Revit will only display patterns of the type selected (Model, here), and will sort them in the list alphabetically. The first pattern on the list will be selected initially, but that may not be the one you want. You can use the Search box above the list box to type in part of the pattern name you seek to make it easier to find, if the file contains a lot of Model patterns.
</li>
<li>You should see the newly added model pattern in the Fill Patterns dialog. Select the <b>OK</b> button to accept the added pattern and return to the Revit model.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiE502WK78HRNg2ef2f_mgsz5_88-y6nOB8xH-SaG_gYX4Euu2O7ucPF0O4_YdP15SEMWsIabU3JNHduSxwXWw6xxN-B56X2FDk38HkuvH9LXJ7GXhLR5yrlbgiTJgOM_LkVhjxw/s1600/06_FillPatternsDialog_NewPattern_OK.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiE502WK78HRNg2ef2f_mgsz5_88-y6nOB8xH-SaG_gYX4Euu2O7ucPF0O4_YdP15SEMWsIabU3JNHduSxwXWw6xxN-B56X2FDk38HkuvH9LXJ7GXhLR5yrlbgiTJgOM_LkVhjxw/s320/06_FillPatternsDialog_NewPattern_OK.png" width="241" height="320" data-original-width="338" data-original-height="448" /></a></div>
</li>
</ol>
<br>
<a href="http://architects-desktop.blogspot.com/2020/01/revit-new-ceiling-grid-pattern-part-2.html">Part 2</a> will cover creating a Material which will use the newly created Fill Pattern.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-30619611688449559272019-11-15T21:17:00.000-05:002019-11-15T21:17:00.504-05:00ACA-AMEP: Edit Property Data Via AutoLISP, Part 3<a href="https://architects-desktop.blogspot.com/2019/11/aca-amep-edit-property-data-via.html">First article in the series.</a>
<br>
<a href="https://architects-desktop.blogspot.com/2019/11/aca-amep-edit-property-data-via_5.html">Previous article in the series.</a>
<br><br>
In the previous article, we used a while loop to examine each Property Set in the collection of Property Sets attached to the object of interest, comparing each Property Set's Name to the name of the Property Set that holds the Property whose value is to be changed. At this point, there are two possible conditions:
<ol>
<li>A matching Property Set was found. The value in the Property Set counter variable, <b>iPSet</b>, was set to one more than the number of Property Sets in the collection (variable <b>iPSets</b>).
</li>
<li>A matching Property Set was not found. The value in the Property Set counter variable, <b>iPSet</b>, will be equal to the number of Property Sets in the collection (variable <b>iPSets</b>).
</li>
</ol>
<pre style="BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: #666666 1px solid; WIDTH: 550px; PADDING-TOP: 6px; BORDER-BOTTOM: #666666 1px solid; HEIGHT: 750px"><span style="font-size:90%;">(cond ; Cond A.
((= iPSet iPSets)
;; If the Property Set is not found after processing all attached property sets, issue prompt.
(prompt
(strcat
"\nProperty Set "
sPSet
" not found on object passed to argument obj. "
) ;_ End strcat.
) ;_ End prompt.
nil ; Return nil.
) ;_ End condition A1.
(T ; Else, continue.
(setq oProps (vlax-get-property oPSet 'Properties)
; Get Properties object of the Property Set.
iProps (vlax-get-property oProps 'Count)
; Get number of Properties in the Property Set.
iProp 0 ; Initialize Property counter.
) ;_ End setq.
(while (< iProp iProps) ; While unprocessed Properties remain...
(setq oProp (vlax-invoke-method oProps 'Item iProp)
; Get current Property object.
sPropNm (vlax-get-property oProp 'Name)
; Get Property name.
) ;_ End setq.
(if (= (strcase sPropNm) (strcase sProp))
; If target Property found...
(setq iProp (1+ iProps)) ; ...exit while loop.
(setq iProp (1+ iProp)) ; ...else, increment Property counter.
) ;_ End if.
) ;_ End while.
(cond ; Cond A2B.
((= iProp iProps)
;; If the Property is not found after processing all Properties in the Property Set, issue prompt.
(prompt
(strcat
"\nProperty "
sProp
" not found in Property Set "
sPSet
" attached to the object passed to argument obj. "
) ;_ End strcat.
) ;_ End prompt.
nil ; Return nil.
) ;_ End condition A2B1.
(T ; Else, update Property value with processed value.
(setq varPropValOld (vlax-get-property oProp 'Value))
***** ADD CODE HERE TO GENERATE THE DESIRED NEW VALUE *****
***** SET VARIABLE sPropValNew to the NEW DESIRED VALUE *****
(vlax-put-property oProp 'Value sPropValNew)
sPropValNew ; Return new string value.
) ;_ End condition A2B2.
) ;_ End cond A2B.
) ;_ End condition A2.
) ;_ End cond A.</span></pre>
<br>
Here is what is happening in that code:
<ul>
<li>A <b>cond</b> statement is used to determine which of the two conditions noted above is active. The first test checks to see if <b>iPSet</b> and <b>iPSets</b> are equal. If this is true, then the target Property Set was not found, and there is nothing to process. A prompt is written to the command line to inform the user. I have a separate subroutine to hold this code, so after issuing the prompt, this condition returns <b>nil</b> to the calling routine, to indicate that the requested Property Set was not found. The calling routine can then choose how to handle that situation.
</li>
<li>If <b>iPSet</b> and <b>iPSets</b> are not equal, then the target Property Set was found and we can continue on. The test for this condition is <b>T</b> (True), because if the first test is false, no further test is required, and the code to process will be contained within this condition.
</li>
<li>Variable <b>oPSet</b> holds the Property Set object whose name matched the target Property Set name. The Properties property of the Property Set object is used to obtain the Properties collection of that Property Set. The Properties collection contains all of the individual Property objects that are defined in that Property Set Definition.
</li>
<li>The Count property of the Properties collection is used to determine the total number of Properties in the collection (variable <b>iProps</b>). A variable to hold the Property counter, <b>iProp</b> is initialized to 0, the index of the first Property in the collection.
</li>
<li>Similar to the way we iterated over the Property Set collection, a <b>while</b> loop is used to iterate over the Properties collection, looking for a Property whose name matches the target property name, which is held in variable <b>sProp</b>. If a match is found, <b>iProp</b> is set to one more than the total number of Properties in the collection. If a match is not found, then <b>iProp</b> is incremented by 1, so that the next Property in the collection will be processed on the next pass of the loop, if at least one unprocessed Proeprty remains.
</li>
<li>At this point, there are two possible conditions:
<ol>
<li>A matching Property was found, and the value of <b>iProp</b> is one more than the value of <b>iProps</b>
</li>
<li>A matching Property was not found, and the values of <b>iProp</b> and <b>iProps</b> are equal.
</li>
</ol>
</li>
<li>Once again, a <b>cond</b> statement is used to run the appropriate code. If a matching Property was not found, the first condition writes a prompt to the command line to inform the user that the Property was not found, and returns <b>nil</b> to the calling routine, to indicate that the requested Property was not found in the requested Property Set. The calling routine can then choose how to handle that situation.
</li>
<li>If the target Property was found, then the first condition will not be executed, and the second condition will be executed, as the test is set to <b>T</b>.
</li>
<li>The Value property of the Property object is used to obtain the current value, storing it in variable <b>varPropValOld</b>.
</li>
<li>At this point, you will need to add the code that generates the new value for the target Property, saving that value to variable <b>varPropValNew</b>
</li>
<li>The <b>vlax-put-property</b> function is used to push the new value onto the Value property of the Property Object. This condition then returns the new value to the calling routine.
</li>
<li>All of the currently open conditions and <b>cond</b> functions are then ended.
</li>
</ul>
<br>
If you choose to have all your code in a single AutoLISP command function, then instead of returning <b>nil</b> or <b>varPropValNew</b> at the end of the A1, A2B1 and A2B2 conditions, you would add whatever additional code you may feel appropriate to run prior to the end of your command function.David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0tag:blogger.com,1999:blog-9315880.post-78502699119743844802019-11-05T21:17:00.000-05:002019-12-31T09:46:00.234-05:00ACA-AMEP: Edit Property Data Via AutoLISP, Part 2<a href="https://architects-desktop.blogspot.com/2019/11/aca-amep-edit-property-data-via.html">First article in the series.</a>
<br><br>
In the previous article, we obtained a collection of the Property Sets on the object for which we want to change the value of a Property. We also determined the total number of Property Sets in the collection, and set up a Property Set counter, initialized to 0, the index of the first Property Set. The following code assumes that you know not only the name of the Property that is to be changed, but also the name of the Property Set in which it resides and that the name is stored in a variable called <b>sPSet</b>.
<pre style="BORDER-RIGHT: #666666 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: #666666 1px solid; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: #666666 1px solid; WIDTH: 550px; PADDING-TOP: 6px; BORDER-BOTTOM: #666666 1px solid; HEIGHT: 180px"><span style="font-size:90%;">(while (< iPSet iPSets) ; While unprocessed Property Sets remain...
(setq oPSet (vlax-invoke-method oPSets 'Item iPSet) ; Get current Property Set object.
sPSetNm (vlax-get-property oPSet 'Name) ; Get Property Set name.
) ;_ End setq.
(if (= (strcase sPSetNm) (strcase sPSet)) ; If target Property Set is found...
(setq iPSet (1+ iPSets)) ; ...exit while loop.
(setq iPSet (1+ iPSet)) ; ...else, increment Property Set counter.
) ;_ End if.
) ;_ End while.</span></pre>
<br>
Here is what is happening in that code:
<ul>
<li>A <b>while</b> loop is used to iterate over the Property Sets collection. The Item method is used to get the Property Set at the current index value in <b>iPSet</b>.
</li>
<li>The Name property of the Property Set object is used to obtain the name of that Property Set.
</li>
<li>An <b>if</b> statement is used to determine if that Property Set name matches the target Property Set name. The <b>strcase</b> function is used to change both strings to all capital letters, to avoid any issues with different capitalization of the names. If a match is found, the <b>iPSet</b> index counter is set to a number one greater than the total numnber of Property Sets in the collection, so that the loop will be exited. If a match is not found, the <b>iPSet</b> index counter is incremented by 1, so that the next Property Set in the collection will be processed on the next pass of the loop, if at least one unprocessed Property Set remains.
</li>
</ul>
<br>
<a href="http://architects-desktop.blogspot.com/2019/11/aca-amep-edit-property-data-via_15.html">Next article in the series.</a>David Kochhttp://www.blogger.com/profile/07433242906997486419noreply@blogger.com0