Still getting up to speed with Revit 2020 and my new virtual machine that I set up for it...
First, however, an interesting adaptation of RvtSamples to run in zero document state:
- RvtSamples adapted for zero document state
- Migrating The Building Coder samples to Revit 2020
- Installing PowerTools Copy HTML Markup
PostCommandto close document
Before the release of Revit 2020, I had an interesting discussion with my French namesake Jérémie on running RvtSamples in zero document state.
As you may know, RvtSamples is simply an external application that reads a text file containing information on (a large number of) external commands and their assembly DLL locations to populate a menu making them all accessible in the Revit user interface without a need to install a separate add-in manifest for each one of them.
It is used to easily provide debugging and testing access to all the external commands provided by the Revit SDK samples.
Question: After several tries on Visual Studio 2017 I finally managed to load RvtSamples to Revit 2019! Thank you for this update!
However, I have a question about this tool.
This application makes it possible to use all the examples of the SDK and also to add others.
The concern is that the manifest seems created by code from the
RvtSamples.txt file and I do not find how to modify this code to add
Personally, I need some of my addins (ExternalCommand) to be
AlwaysVisible to allow their use from the opening of Revit.
Is it possible to do this simply?
Answer: Yes, sure you can simply set
AlwaysVisible in the add-in manifest for any add-in you like.
Look at the description of Add-in Registration settings in the Developer Guide.
The RvtSamples.txt text input file is not created by the program, but hand edited.
I implemented it originally in 2008 to load the Revit SDK samples.
At that time, it only held four lines of text per external command to load.
That number was later expanded to seven, adding support for the tooltip text, small and large icon image.
The visibility mode could be added to the list of data to be read from that file, but is not currently so.
You could add that support yourself if you like, by modifying the RvtSamples application yourself.
It is probably simpler to implement the specific external commands that you wish to equip with this setting in a separate add-in with their own add-in manifest.
Response: Yes, I have already split the
RvtSamples.txt file to match what I want and it works without any worries.
Yes, that's exactly what I wanted to do: modify the code to add an 8th line to add this option (or more simply change the default to AlwaysVisible).
Unfortunately, I have not yet managed to understand the code enough to do that. I will continue to search in this case.
Answer: The code is simple. Edit the RvtSamples module
AddSample reads seven lines of text from RvtSamples.txt.
Modify it to read eight lines instead.
Or, as you suggest, set the default to
AlwaysVisible. Oh no, this all makes no sense at all. AlwaysVisible applies to a standard external command loaded by Revit into the external tools menu. We are not loading anything at all into the external tools menu, but creating our own menu instead. Is the RvtSamples panel visible and active in zero document state?
Response: The RvtSamples panel is visible but disabled in zero document state.
But now it works. I ended up finding what was blocking me in the article on enabling ribbon items in zero document state.
To implement this in RvtSamples, it's ultimately relatively simple.
- Implement public class Availability: IExternalCommandAvailability (where
IsCommandAvailablereturns true) in every external DLL you want active in zero document state.
- In the RvtSamples Application, set the
AvailabiltyClassNameproperty of the PushButton object to namespaceOfTheExternalDll.Availability.
Thank you for your help.
Many thanks to Jérémie for this initiative, discussion, research and project modification!
For posterity, I copied his
7z archive to The Building Coder repository, also converted to a corresponding
I migrated The Building Coder samples to Revit 2020.
After updating the Revit API assembly DLLs to the new version, one error occurred:
- Error CS1061 in CmdGetMaterials.cs line 736:
Applicationdoes not contain a definition for
get_Assetsand no extension method
get_Assetsaccepting a first argument of type
Applicationcould be found.
It was referenced in the method
ListAllAssets, whose only purpose was to test this property.
I guess it has no particular use.
Maybe it never did?
Anyway, since the method is never called, I simply commented it out.
The current version is release 2020.0.145.0.
I prefer to colourise the C# source code I publish here on the blog, cf. below.
This can be achieved by installing an additional tool in Visual Studio.
I installed those and they still work fine:
A long, long time ago, we discussed closing the active document and why not to do so using a Windows message workaround, later followed by another exploration on how to close the last document by first opening a dummy document so that the other 'real' document can be closed.
Bogdan just provided a new effective suggestion for closing the active document using
his comment on the former post:
Maybe someone has already found this solution to close the active document in Revit; I found the following method:
RevitCommandId closeDoc = RevitCommandId.LookupPostableCommandId( PostableCommand.Close ); uiapp.PostCommand( closeDoc );
(Voila, my first use of the new Copy HTML Markup menu item :-)
I added the new method to The Building Coder samples release 2020.0.145.1.