feat: add clickable EnergyPlus doc links throughout OpenStudioApp UI#876
feat: add clickable EnergyPlus doc links throughout OpenStudioApp UI#876Ski90Moo wants to merge 20 commits into
Conversation
|
Looks pretty good, the one thing I would ask for is a tooltip which shows you the url before you click |
3f0d922 to
453f037
Compare
- Define ENERGYPLUS_VERSION_MAJOR/MINOR and BIGLADDERSOFTWARE_DOC_BASE_URL in FindOpenStudioSDK.cmake (single source of truth for the BigLadder URL base); pass to C++ via target_compile_definitions in model_editor and openstudio_lib; remove hardcoded URL strings from IddObjectDocUrl.hpp and SimSettingsView.cpp - Rename layoutText header overload to layoutHeaderText, drop unused level/ index parameters per macumber's cleaned-up version - Add setToolTip(docUrl) to all clickable doc links so the URL is visible on hover before clicking (InspectorGadget header, CollapsibleInspector section headers, SimSettings H1 labels) Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
|
Thanks for the feedback! Tooltips showing the full URL have been added to all clickable doc links — both in the inspector header (via |
|
Addressed the |
| label->setOpenExternalLinks(true); | ||
| { | ||
| static const QString url = | ||
| QString::fromStdString(openstudio::bigladdersoftwareDocBaseUrl()) + "group-simulation-parameters.html#building"; |
There was a problem hiding this comment.
| QString::fromStdString(openstudio::bigladdersoftwareDocBaseUrl()) + "group-simulation-parameters.html#building"; | |
| QString::fromStdString(openstudio::bigladdersoftwareDocBaseUrl()) + iddObjectDocUrl("OS:Building"); |
It would be better to handle all of these using iddObjectDocUrl so all the url fragments are in one place.
There was a problem hiding this comment.
Addressed in 2b58110 — the inline URL fragments were consolidated into iddObjectDocUrl(), so the call site now just uses iddObjectDocUrl(QStringLiteral("OS:Building")) directly.
|
@Ski90Moo one thing I found is that you have to use the same version of clang-format that the CI is using, 18.1.3, other versions of clang-format don't find the same issues as CI. |
|
Thanks for the heads-up. The |
|
Addressed the remaining review comments:
Warning log — Added Group URL lookup — Added |
|
|
||
| using T = std::tuple<IddObjectType, std::string, QString>; | ||
| return { | ||
| T{IddObjectType::OS_Construction, "Constructions", sce + "#construction-000"}, |
There was a problem hiding this comment.
| T{IddObjectType::OS_Construction, "Constructions", sce + "#construction-000"}, | |
| T{IddObjectType::OS_Construction, "Constructions", iddObjectDocUrl(QStringLiteral("OS:Construction"), |
These urls are already defined in IddObjectDocUrl.hpp, we should use those definitions rather than duplicate them here. Same thing for all the other urls in this file and others such as:
- https://github.com/openstudiocoalition/OpenStudioApplication/pull/876/changes#diff-041047d3606ed5e7fec54dcfe4e8e7ce2f5720433717aaa1e00936250e7140b6R105
- https://github.com/openstudiocoalition/OpenStudioApplication/pull/876/changes#diff-e35d718a8caea938a126dcce1d7f7baae6e2878d2325aa60c129adc74f6254e0R159
- https://github.com/openstudiocoalition/OpenStudioApplication/pull/876/changes#diff-25e93e6585f3692c885d623d1223853ca5b3362b49d23fb99e8bbeb6d1ba357dR53
- etc
There was a problem hiding this comment.
Thank you macumber, agreed. Done in 42c02c2 — added 18 missing type→URL entries to IddObjectDocUrl.hpp (Construction variants, WindowMaterial variants, Schedule:File, GroundTemperature:Shallow/Deep, RunPeriodControl:DaylightSavingTime, ConvergenceLimits, ZoneCapacitanceMultiplier:ResearchSpecial, Output types, LifeCycleCost types) and replaced all bigladdersoftwareDocBaseUrl() + hardcoded fragment patterns across 9 view files (ConstructionsView, MaterialsView, LoadsView, ScheduleOthersView, SimSettingsView, GroundTemperatureView, LifeCycleCostsTabView, LocationTabView, YearSettingsWidget) with iddObjectDocUrl() / iddGroupDocUrl() calls.
|
@jmarrec do you have thoughts on this PR? Both this PR and the BCL one rely on an external webpage which we don't have control over. I have thought that it might be better to make the URLs configurable in preferences rather than hard coded. However, if the URLs ever change it is also likely that the API/site layout would change which would break the integration. I am leaning towards something like 1) Make the URLs configurable, 2) Test the URLs at startup and disable functionality if they are not available. What do you both think? That could be implemented on a separate PR if we want to do it. I think this PR is setup for it well, if we return an empty URL when the integration test fails the tooltips just won't be added. |
|
I like the idea of adding some help! But I think I'm quite against linking to the Big Ladder website because like you said we have zero control over it. The URL may change, the links could be broken in a new version, etc. The BCL endpoint changing recently is a pain that makes it quite clear this is something we should avoid. I've already build the E+ HTML documentation recently, it's quite simple to do with pandoc really. I'm not quite sure if we are allowed to host that on a domain we control or not though (license wise), but this is something we should perhaps investigate. |
|
Maybe we just build the html and then ship with the app? |
|
Thanks for digging into this, @macumber and @jmarrec — these are fair concerns and I want to share the motivation behind the feature so the tradeoff is clearer. The original driver was actually the in-progress i18n work (#873): once the GUI is translated, a non-English-speaking user is still stuck with English-only EnergyPlus/OpenStudio documentation. Rather than have OpenStudio take on the burden of translating that documentation ourselves, the idea is to get the user to the relevant doc page quickly so they can use their own browser's built-in translator (Chrome, Edge, etc. all do this well now) — no extra maintenance burden on us, and the user gets a translation tuned to their specific language and reading level. On the "we don't control BigLadder" concern — that's true, but I'd note a few things that make this a different kind of dependency than the BCL endpoint:
I think @macumber's suggestion (configurable base URL + an availability check at startup that disables the feature gracefully) is a great safety net regardless of which docs we ultimately link to, and could be layered on without much rework — happy to tackle that as a fast-follow on this PR or a separate one. @jmarrec's idea of bundling locally-built E+ HTML docs is appealing for full independence, but it's a much larger scope change (build pipeline, packaging size, licensing question you raised, and keeping it in sync with the bundled E+ version). If that's the direction the project wants to go long-term, I'm happy to help, but I'd suggest it's worth treating as its own initiative rather than blocking this PR — which, as currently designed, fails safe if the links ever do break. Let me know how you'd like to proceed — happy to adjust scope based on your call. |
|
I am going to do some legwork to inquire whether we can host it somewhere (we've discussed with the E+ dev team to have it on energyplus.net or readthedocs in the past, and otherwise I'll see if we can do it on a domain we control here) . I'll keep you posted. |
That would be great! Thank you @jmarrec. |
Merges #873 from @Ski90Moo on internal branch for CI Wraps user-facing string literals with tr() across all major tabs and adds a complete Spanish (es) translation file as proof of concept for multi-language support, addressing issue #680. Tabs covered: Site/Weather Data, Construction Sets, Materials, Schedules, Thermal Zones, Space Types, Loads, Facility, HVAC Systems, Inspector panel IDD fields, Output Variables (1051 names), Simulation Settings, Measures, Run Simulation, and Results Summary. Key patterns established: - tr() for compile-time strings in Q_OBJECT classes - QCoreApplication::translate(IDD/OutputVariables/TaxonomyCategories) for runtime strings from the OpenStudio SDK and taxonomy.xml - addItem(tr(Display), EnglishData) + currentData() for model-bound combo boxes where SDK values must stay in English - Bilingual display format for IDD fields and output variable names so engineers can cross-reference EnergyPlus documentation without switching the application language
…headers Add IddObjectDocUrl.hpp mapping 300+ OS IDD type names to EnergyPlus 25.1 Input/Output Reference URLs. InspectorGadget::layoutText() now renders IDD type headers as clickable hyperlinks in the right-sidebar inspector. Extend CollapsibleInspector to accept an optional URL parameter, and wire 15 section headers in SimSettingsView (plus the Run Period, Sizing Parameters, and Timestep H1 labels) to their respective BigLadder doc anchors. Closes openstudiocoalition#160 Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Define ENERGYPLUS_VERSION_MAJOR/MINOR and BIGLADDERSOFTWARE_DOC_BASE_URL in FindOpenStudioSDK.cmake (single source of truth for the BigLadder URL base); pass to C++ via target_compile_definitions in model_editor and openstudio_lib; remove hardcoded URL strings from IddObjectDocUrl.hpp and SimSettingsView.cpp - Rename layoutText header overload to layoutHeaderText, drop unused level/ index parameters per macumber's cleaned-up version - Add setToolTip(docUrl) to all clickable doc links so the URL is visible on hover before clicking (InspectorGadget header, CollapsibleInspector section headers, SimSettings H1 labels) Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- OS:Schedule:Day - OS:Coil:Cooling:DX:TwoStageWithHumidityControlMode - OS:Coil:Cooling:DX:MultiSpeed:StageData - OS:Coil:Cooling:Water:Panel:Radiant - OS:Coil:Heating:Gas:MultiStage + :StageData - OS:Coil:Heating:LowTemperatureRadiant:ConstantFlow + :VariableFlow - OS:Coil:Heating:Water:Baseboard:Radiant - OS:Coil:WaterHeating:AirToWaterHeatPump - OS:SetpointManager:FollowSystemNodeTemperature Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Adds BigLadder doc URL mappings for: LowTemperatureRadiant coils, CoilPerformance:DX:Cooling, Coil:Heating:Water:Baseboard, 10 setpoint managers (MultiZone/SingleZone humidity, SingleZone stage, SystemNodeReset), SolarCollectorPerformance x2, Chiller:Absorption, CentralHeatPumpSystem:Module, PlantComponent:TemperatureSource/UserDefined, CoolingTower:VariableSpeed, CoolingTowerPerformance x2, Pipe:Indoor/Outdoor/Duct, TemperingValve, LoadProfile:Plant, Fan:ComponentModel, Site:GroundTemperature:Undisturbed:KusudaAchenbach, SwimmingPool:Indoor, AirTerminal:SingleDuct:ConstantVolume:FourPipeInduction, and 5 new curve types. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Extends OSCollapsibleItemHeader to optionally render its text as a clickable BigLadder hyperlink. Adds a URL-aware constructor to ModelObjectTypeListView. Applies links to four left-sidebar panels: Loads, Constructions (subtab), Materials (subtab), and Other Schedules. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Site / Weather File & Design Days: Weather File, Design Days, and Daylight Savings Time headers link to BigLadder I/O Reference - Site / Ground Temperatures: all five sidebar entries link to their respective Site:GroundTemperature:* and Site:WaterMainsTemperature docs - Site / Life Cycle Cost: Life Cycle Cost Parameters and NIST Fuel Escalation Rates headers link to LifeCycleCost docs - Facility tab: North Axis label links to Building object docs Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…function Per PR review feedback: instead of passing the URL via target_compile_definitions, add bigladdersoftwareDocBaseUrl() to OpenStudioApplicationPathHelpers following the existing .cxx.in pattern. The URL is configured from BIGLADDERSOFTWARE_DOC_BASE_URL in FindOpenStudioSDK.cmake — visible alongside EnergyPlus version bumps each release. All call sites updated to use QString::fromStdString(openstudio::bigladdersoftwareDocBaseUrl()). Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Scans IddObjectDocUrl.hpp and all .cpp files that reference bigladdersoftwareDocBaseUrl(), fetches each unique BigLadder page once, and verifies that every anchor ID referenced actually exists in the page HTML. Exits 0 if all OK, 1 if any anchors are missing or pages fail to load. Usage: python scripts/check_doc_urls.py [--repo-root PATH] [--delay SEC] Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Identified by scripts/check_doc_urls.py which fetches BigLadder pages and verifies anchor IDs exist in the HTML. Fixes include: - Wrong page: RunPeriod, InternalMass, PlantLoop/CondenserLoop, AvailabilityManagerAssignmentList, HeatExchanger:FluidToFluid, OutdoorAir:Mixer, ZoneMixer/Splitter/ReturnPlenum/SupplyPlenum - Typos: materialaingap→materialairgap, celdeckpad→celdekpad (×2), outdoorarreset→outdoorairreset, multizoneheat/coolaverage→heating/coolingaverage - Sphinx suffixes: lights→lights-000, construction→construction-000, daylightingcontrols→daylightingcontrols-000 - Hyphen removal: buildingsurface-detailed→buildingsurfacedetailed, fenestrationsurface-detailed→fenestrationsurfacedetailed - Renames: Uncontrolled→ConstantVolume:NoReheat, Fuel→Gas-000, ShadingControl→WindowPropertyShadingControl, WaterHeaterHeatPump→WaterHeaterHeatPumpPumpedCondenser, GroundHeatExchanger:Vertical→GroundHeatExchangerSystem - FourPipeBeam coils moved to air-distribution-equipment page 7 anchors remain unverifiable (page too long for fetch tool): HeatPump:PlantLoop:EIR:Cooling/Heating, PLHP:AirToWater (×3), WindowProperty:FrameAndDivider, InteriorPartitionSurface:Detailed. Also updates check_doc_urls.py docstring with rationale for choosing Python script over GTest, and updates OpenStudioApplicationPathHelpers with bigladdersoftwareDocBaseUrl() accessor function. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- WindowProperty:FrameAndDivider: correct page (thermal-zone not surface-construction) - InteriorPartitionSurface: remove (no EnergyPlus object, not user-facing in GUI) - HeatPump:PlantLoop:EIR:Cooling/Heating: correct anchors (#plhp_eir_cooling/heating) - HeatPump:AirToWater / :Cooling / :Heating: remove (no EnergyPlus object) All 384 URL references now pass check_doc_urls.py verification. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Run clang-format -style=file on all C++ files changed relative to develop, to satisfy the Clang Format CI check. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…InspectorView
- Add qWarning log when iddObjectDocUrl cannot find a URL for a type
- Use iddObjectDocUrl("OS:Building") in BuildingInspectorView instead of
hardcoded URL fragment, consolidating all URL fragments in one place
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
… pages Adds a new iddGroupDocUrl(groupName) function to IddObjectDocUrl.hpp that maps OpenStudio.idd \group names to their corresponding BigLadder EnergyPlus I/O Reference page URLs. Groups that span multiple EnergyPlus chapters (e.g. "OpenStudio HVAC") are intentionally omitted. Also updates check_doc_urls.py regex to cover groupMap entries alongside the existing urlMap entries. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Co-authored-by: Dan Macumber <[email protected]>
Addresses macumber's review comment (#discussion_r3338463868). - Add 18 missing type→URL entries to IddObjectDocUrl.hpp (Construction variants, WindowMaterial variants, Schedule:File, GroundTemperature Shallow/Deep, RunPeriodControl:DaylightSavingTime, ConvergenceLimits, ZoneCapacitanceMultiplier:ResearchSpecial, Output types, LifeCycleCost types) - Replace all bigladdersoftwareDocBaseUrl() + hardcoded fragment patterns in 9 view files with iddObjectDocUrl() / iddGroupDocUrl() calls - Affected files: ConstructionsView, MaterialsView, LoadsView, ScheduleOthersView, SimSettingsView, GroundTemperatureView, LifeCycleCostsTabView, LocationTabView, YearSettingsWidget Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
ENERGYPLUS_VERSION_MAJOR/MINOR in FindOpenStudioSDK.cmake had drifted to 25-1 while the bundled OpenStudio 3.11.0 SDK ships EnergyPlus 25.2, producing doc links for the wrong EnergyPlus version. Instead of a second manually-maintained version constant, build the BigLadder base URL from energyPlusVersionMajor()/energyPlusVersionMinor() in the SDK's OpenStudio.hxx, which is already the source of truth and updates automatically whenever the SDK is bumped. check_doc_urls.py now auto-detects the same version from OpenStudio.hxx instead of a hardcoded 25-1 base URL. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
03f300e to
6b0a468
Compare
|
@Ski90Moo let's include this in the RC2 In order to avoid depending on more online sources (which have caused us problems), let's update this to work with installed docs in the package. To do this, I think the basic steps are:
@jmarrec might be able to give you a little more specifics |
Stopgap per macumber's PR 876 request to stop depending on a live third-party site for the I/O Reference docs: download jmarrec's pre-built HTML export from Google Drive at configure time, install it alongside the app, and remap all existing doc URLs to point at it. - FindEnergyPlusDocs.cmake downloads, MD5-verifies, and extracts the export, mirroring FindOpenStudioSDK.cmake's pattern. - bigladdersoftwareDocBaseUrl() replaced with energyPlusDocDirectory(), resolving build-tree vs. installed locations like resourcesPath(). - IddObjectDocUrl.hpp's 393 urlMap/groupMap entries remapped across 47 distinct pages to the export's actual filenames, with every anchor verified to resolve against the export's HTML. 6 pages needed manual correction beyond simple prefix-stripping, including two genuine content-relocation cases (AirTerminal:* objects and the Output:JSON/ ReportingTolerances/ResilienceSummaries group) caught only because every anchor was checked against real id= attributes rather than trusting the filename match. - check_doc_urls.py now validates the local files instead of fetching bigladdersoftware.com. Verified via an actual cmake configure + build of the affected targets (openstudioapp_utilities, openstudio_modeleditor, openstudio_lib) plus the full OpenStudioApp executable, and a live run confirming doc-link tooltips open the local HTML at the right anchor. The reproducible build pipeline behind the export is still pending from jmarrec; this Drive download is an interim measure.
…t/doc-links-inspector # Conflicts: # .gitignore
|
@jmarrec — thanks again for the Confirmed working: real cross-page hyperlinks, native MathML equations (no JS/bitmaps), and all 393 of our existing anchor references resolve correctly against your export's HTML. A few questions as we look at making this permanent rather than a one-off download:
|
Yes, you do want to build documentation for a specific E+ tag.
The HTML docs were meant to be online, so CDN made sense. I also happen to have a single-page version where it was nice to have everything in one file (images can be base64 encoded) Anyways, that's easy to change, download a few files, do a global sed.
Yeah I actually need to figure that out, I hit this error when uploading to github artifact too (the colon was rejected for upload as it's not NTFS compliant) |
Summary
Implements the enhancement requested in #160 — adds clickable hyperlinks from UI section headers and IDD type headers to the relevant EnergyPlus 25.1 Input/Output Reference pages on BigLadder Software. Tooltips show the full URL before clicking.
Inspector / IDD object headers
src/model_editor/IddObjectDocUrl.hpp(new): header-only hash map (QHash<QString, QString>) mapping 300+OS:*IDD type names to their BigLadder EnergyPlus 25.1 I/O Reference URLssrc/model_editor/InspectorGadget.cpp: renders the locked IDD type header in the right-sidebar inspector as aQt::RichTexthyperlink when a URL mapping existsLeft-sidebar category headers
src/openstudio_lib/OSCollapsibleItemHeader.hpp/.cpp: extendsOSCollapsibleItemHeaderwith an optional URL; when set, the category name renders as a clickable blue linksrc/openstudio_lib/ModelObjectTypeListView.hpp/.cpp: adds a new constructor acceptingvector<tuple<IddObjectType, string, QString>>to thread URLs through to each headerSection headers (SimSettings pattern)
src/openstudio_lib/CollapsibleInspector.hpp/.cpp: extendsCollapsibleInspectorHeaderwith an optional URL; section title renders as a clickable linksrc/openstudio_lib/SimSettingsView.cpp: 15CollapsibleInspectorsection headers and 3 H1 labels (Run Period, Sizing Parameters, Timestep)src/openstudio_lib/LocationTabView.cpp: Weather File and Design Days headerssrc/openstudio_lib/YearSettingsWidget.cpp: Daylight Savings Time headersrc/openstudio_lib/GroundTemperatureView.hpp/.cpp: all 5 Ground Temperatures sidebar entriessrc/openstudio_lib/LifeCycleCostsTabView.cpp: Life Cycle Cost Parameters and NIST Fuel Escalation Rates headerssrc/openstudio_lib/BuildingInspectorView.cpp: North Axis label (Facility tab)Build infrastructure
cmake/FindOpenStudioSDK.cmake: definesBIGLADDERSOFTWARE_DOC_BASE_URLas a single versioned CMake variable (EnergyPlus 25.1)src/model_editor/CMakeLists.txtandsrc/openstudio_lib/CMakeLists.txt: pass the URL as a compile definition so all files share a single source of truth for the base URLTest plan
Closes #160
🤖 Generated with Claude Code