app
Adom Step2GLB - STEP to GLB converter
Public Made by Adomby adom
Color-preserving STEP (.step/.stp) to GLB converter. Thin Rust CLI shelling to a shared OCCT XCAF service. Formerly 'step2glb'.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
use std::process::Command;
/// Open a Hydrogen webview tab pointing at the preview URL, on a non-VS-Code pane.
/// Mirrors the adom-workspace-control skill — never land on the pane hosting VS Code.
pub fn open_webview_tab(name: &str, url: &str) -> Result<(), String> {
// Resolve a non-VS-Code panel id via adom-cli.
let state = Command::new("adom-cli")
.args(["hydrogen", "workspace", "state"])
.output()
.map_err(|e| format!("adom-cli not available: {e}"))?;
if !state.status.success() {
return Err(format!(
"adom-cli state failed: {}",
String::from_utf8_lossy(&state.stderr)
));
}
let panel_id = first_non_vscode_panel(&String::from_utf8_lossy(&state.stdout));
let mut cmd = Command::new("adom-cli");
cmd.args([
"hydrogen", "workspace", "add-tab",
"--panel-type", "adom/a1b2c3d4-0031-4000-a000-000000000031",
"--display-name", name,
"--url", url,
]);
if let Some(pid) = panel_id {
cmd.args(["--panel-id", &pid]);
}
let out = cmd.output().map_err(|e| format!("add-tab exec: {e}"))?;
if !out.status.success() {
return Err(format!(
"add-tab failed: {}",
String::from_utf8_lossy(&out.stderr)
));
}
Ok(())
}
fn first_non_vscode_panel(state_json: &str) -> Option<String> {
let v: serde_json::Value = serde_json::from_str(state_json).ok()?;
let panels = v.get("panels")?.as_array()?;
for p in panels {
let id = p.get("id")?.as_str()?;
let tabs = p.get("tabs").and_then(|t| t.as_array()).cloned().unwrap_or_default();
let hosts_vscode = tabs.iter().any(|t| {
t.get("panelType")
.and_then(|s| s.as_str())
.map(|s| s.contains("vscode"))
.unwrap_or(false)
});
if !hosts_vscode {
return Some(id.to_string());
}
}
None
}