Liz Larsen
Member
Forum Replies Created
-
Liz Larsen
MemberOctober 27, 2022 at 6:45 am in reply to: Sharing Profiles – How to Make Sure Everyone has the Latest Updates?Points: 5,215Rank: UC2 Brainery Purple Belt
Late to the party, sorry.
If it’s only toolsets you’re wanting to distribute, I’d just put them on a network drive and tell everywhere where’re they’re located and how to add them to their own profile.
Since you mentioned wanting to keep them updated, make sure your team knows the difference between “Import” and “Add”. Import makes a copy and saves it on the user’s computer (I believe), whereas Add actually maps to the network drive so your users will automatically see any toolset updates when they close and re-open Bluebeam.
-
Points: 5,215Rank: UC2 Brainery Purple Belt

First of all, this is a really clever system.
Next, for the dropdowns, I noticed the trigger was set to “on blur” rather than the standard “mouse up”. Can you explain your reasoning? I never use it in Bluebeam forms and am genuinely curious as to when/why I might want to.
I ask because for the “on blur” to trigger, you actually have to click outside of the dropdown. So, for example, I can change one of the dropdowns from 3 to 4, and you won’t see the update of an additional line until I, the user, actively click outside of the dropdown box (or tab, or hit enter). Whereas if you use “mouse up”, the change happens immediately.
I suspect (but have no way of knowing for certain) that the lag issue is caused by so many “global scripts” rather than storing the scripts within the individual form fields’ JavaScript.
Also, if I were you, I would perhaps find a way to use regex to reduce the need for the verbosity that currently exists. There is a coding principal that I’m quite fond of called DRY (Don’t Repeat Yourself). I think you could reduce the number of scripts (Set Taps Box 1, Set Taps Box 2, etc…) and reduce the length of the scripts themselves (FindOCG(“6-1”), FindOCG(“6-2”), etc…) by using regular expressions to loop through these, thereby reducing the amount of code you have.
Again, really clever use of forms and JavaScript here. I only spent about 15 minutes looking over your sheet, so I’m probably missing some intricacies of how everything works. Feel free to reach out for further discussion. I love what you’ve accomplished so far.
-
Liz Larsen
MemberOctober 6, 2022 at 7:01 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
First of all, this is a really clever system.
Next, for the dropdowns, I noticed the trigger was set to “on blur” rather than the standard “mouse up”. Can you explain your reasoning? I never use it in Bluebeam forms and am genuinely curious as to when/why I might want to.
I ask because for the “on blur” to trigger, you actually have to click outside of the dropdown. So, for example, I can change one of the dropdowns from 3 to 4, and you won’t see the update of an additional line until I, the user, actively click outside of the dropdown box (or tab, or hit enter). Whereas if you use “mouse up”, the change happens immediately.
I suspect (but have no way of knowing for certain) that the lag issue is caused by so many “global scripts” rather than storing the scripts within the individual form fields’ JavaScript.
Also, if I were you, I would perhaps find a way to use regex to reduce the need for the verbosity that currently exists. There is a coding principal that I’m quite fond of called DRY (Don’t Repeat Yourself). I think you could reduce the number of scripts (Set Taps Box 1, Set Taps Box 2, etc…) and reduce the length of the scripts themselves (FindOCG(“6-1”), FindOCG(“6-2”), etc…) by using regular expressions to loop through these, thereby reducing the amount of code you have.
Again, really clever use of forms and JavaScript here. I only spent about 15 minutes looking over your sheet, so I’m probably missing some intricacies of how everything works. Feel free to reach out for further discussion. I love what you’ve accomplished so far.
-
Liz Larsen
MemberSeptember 14, 2022 at 6:45 pm in reply to: Input Wanted: Process for Sharing Custom StatusesPoints: 5,215Rank: UC2 Brainery Purple Belt
I’ll go first!
Throughout most of my experience using custom statuses, we’ve used a profile saved to a network drive set as read-only (so people can’t unintentionally modify it). This means that everyone’s Bluebeam interface looks the same.
Pros:
- Statuses are automatically available and users always have the latest version.
- Toolchests are also saved on network drive and also are automatically updated for each user.
- If I do a tutorial for the team, everyone’s buttons are in the same place so they can easily follow along.
- The profile doesn’t have the default statuses that come with Bluebeam out of the box. This is a good thing because sometimes some weird things can happen if a user has one of the default statuses active while trying to use custom statuses.
- LITERALLY NOTHING IS REQUIRED FROM THE USERS FOR THEM TO BE USING THE LATEST AND GREATEST.
Cons:
- Sometimes people don’t like being told their interface has to look a certain way.
- Sometimes people like having their own toolchests (beyond the unique My Tools toolchest).
- … That’s it? There are no more cons that I can think of.
I’ve attached a screenshot of what our statuses look like. Red/orange are in the process of being picked up. Blue/purple are questions or coordination items. Gray is complete, meaning either the question has been answer or the markup has been backchecked and no further action is required.
Let me know what you think and if you have any comments/questions on this method!
-
Liz Larsen
MemberOctober 27, 2022 at 9:29 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
I actually started working on this and it’s more difficult than initially anticipated. However, I think I’m onto something and I’ll update you when I figure it out. Stay tuned!
-
Liz Larsen
MemberOctober 27, 2022 at 8:02 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
My last little tiny piece of advice would be to move the primary code from the dropdown boxes (ie the NumberOfTaps_ form field local code) into one single function within the global JavaScript. Then in each dropdown box local code, you would set a variable like var numberOfTaps = this.getField(“NumberOfTaps2”); then call the global function using that variable.
This means if you need to update the primary code, you only have to update the global function rather than every single dropdown box.
I did not do this for my game that I made (and posted earlier in this thread) and I should have. At some point I’ll go update it to fix that. Cuz let me tell you, it was a PAIN to update the virtually identical code in every single square for some silly little mistake when I was in the process of creating it. Oof.
I hope that makes sense. If you need additional explanation or help, let me know.
-
Liz Larsen
MemberOctober 27, 2022 at 5:57 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
The tapsMask will match either parent or child layers for all the terminal layers. So it’ll match standalone digits up to 99 and it’ll match any of those with child layers, ie 1-1, 1-2, etc… up to 99-99. I did this because I knew all parent or child layers greater than the number of terminals should be off and it was easy to just turn them all off.
Then the next else if looks for just parent terminal layers (ie 1 or 2 digits only) less than or equal to the number of terminals and turns those on.
Then the last else if looks for children terminal layers that are less than or equal to the number of taps for that particular parent layer and turns those on, if that fails, turn the rest for that tap off.
—————————————————————————————-
The double vertical lines || are indeed an OR test. That first if statement only cares if the first two digits are greater than the number of terminals, so the OR is looking for up to 2 digits only OR 2 digits that come before a “-” dash.
—————————————————————————————-
Thank you for commenting the code better than I did. I started to, and then kinda stopped… I make an attempt, but not a very good attempt when it comes to that.
-
Liz Larsen
MemberOctober 27, 2022 at 9:40 am in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
I recorded everything in one take, first try 😂 I didn’t like how the sound quality came out, so I contemplated re-recording but decided against it. I hope people give me some grace for my first ever video.
-
Liz Larsen
MemberOctober 27, 2022 at 6:57 am in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
To help explain regular expressions and how they work with JavaScript in Bluebeam, I made a video.
Regular expressions lend themselves really well to writing code in JavaScript. It’ll vastly cut down on code bloat due to hard-coding form field or layer names, plus it’ll make your code more versatile in the future since the regular expression will take care of any new form fields that follow the naming convention you’ve already set.
Not sure if that makes sense, but the video will help with that.
-
Liz Larsen
MemberOctober 26, 2022 at 10:23 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
Additionally, since I went through the process on my own and learned a lot, I’m going to look through your code tomorrow and see if I can figure out why it wasn’t working.
-
Liz Larsen
MemberOctober 26, 2022 at 10:21 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
Ok, so, I wasn’t sure why it wasn’t working.
I ended up writing the NumberOfTerminals dropdown box code from scratch to better learn how everything works. I like to do this piece by piece in the console first to make sure my code is doing what I expect. If it’s not, I troubleshoot until I get an expected result. Then I add that code to my overall code. Rinse and repeat until I have something that works.
This process has two benefits:
- I don’t have to search a huge block of code for errors since I’m basically testing one thing at a time.
- I learn more about how JavaScript itself works and how to get it to effectively “talk” to Bluebeam.
I did get something that works (attached) and even though it works, I still get some “false” and “undefined” stuff showing up in the console, not sure why that’s appearing or if it’ll be troublesome later.
I must go to bed now because it’s late, but take a look at what I wrote and let me know what you think.
-
Liz Larsen
MemberOctober 10, 2022 at 4:44 pm in reply to: Isaac Harned – Here for forms with javascriptPoints: 5,215Rank: UC2 Brainery Purple Belt
I used regex in this game I made within Bluebeam.
See the attached PDF and screenshot.
The screenshot was taken from the code attached to any of the Square buttons (Square1, Square2, etc…)
Basically, the code that uses the regex loops through all the gray/cyan buttons to see if any of them are cyan to test for a win/lose condition. Since there are a couple other buttons, I wanted this particular for loop to ignore those. That’s why all the buttons have a consistent naming scheme. The regex looks for form fields with the word “Square” followed by 1 or 2 digits, and ignores everything else.
If you’d like a free, interactive place to learn and practice some regular expressions, I recommend Free Code Camp. They have a course called JavaScript Algorithms and Data Structures (https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/). The Regular Expressions are the 3rd section when you scroll down.
I also just found this site 5 seconds ago that seems like it would be very helpful (and free): https://regexlearn.com/learn/regex101
Hopefully this gets your brain thinking about methods to condense some of your functions and how you can then combine some of your functions into a single function. Good luck and let me know if you need anymore help!
-
Points: 5,215Rank: UC2 Brainery Purple Belt

I used regex in this game I made within Bluebeam.
See the attached PDF and screenshot.
The screenshot was taken from the code attached to any of the Square buttons (Square1, Square2, etc…)
Basically, the code that uses the regex loops through all the gray/cyan buttons to see if any of them are cyan to test for a win/lose condition. Since there are a couple other buttons, I wanted this particular for loop to ignore those. That’s why all the buttons have a consistent naming scheme. The regex looks for form fields with the word “Square” followed by 1 or 2 digits, and ignores everything else.
If you’d like a free, interactive place to learn and practice some regular expressions, I recommend Free Code Camp. They have a course called JavaScript Algorithms and Data Structures (https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/). The Regular Expressions are the 3rd section when you scroll down.
I also just found this site 5 seconds ago that seems like it would be very helpful (and free): https://regexlearn.com/learn/regex101
Hopefully this gets your brain thinking about methods to condense some of your functions and how you can then combine some of your functions into a single function. Good luck and let me know if you need anymore help!
-
Liz Larsen
MemberSeptember 15, 2022 at 9:09 pm in reply to: Input Wanted: Process for Sharing Custom StatusesPoints: 5,215Rank: UC2 Brainery Purple Belt
Thanks for joining the discussion!
Question: Is the P_ markup a textbox or a snapshot? Either way, I am surprised it behaves that way.
All tools in my toolchests are created from markups and *none* of them have white fill unless it’s a text box. I actually use white filled text boxes as a way to whiteout the background because it’s one of the two things that won’t change color with statuses (the other being fill pattern). But other than that, no fill colors because it clashes with my status colors.
-
Liz Larsen
MemberSeptember 15, 2022 at 9:04 pm in reply to: Input Wanted: Process for Sharing Custom StatusesPoints: 5,215Rank: UC2 Brainery Purple Belt
I actually didn’t know document statuses override profile statuses. I’m the only one ever implementing statuses, and even then we only use them within session. So this isn’t an issue I’ve come across.