chore: rename H7CAD to Open CAD Studio

Joining the OpenAEC Foundation (open-aec.com). Crate/struct become
OpenCADStudio, user-facing strings use the spaced "Open CAD Studio"
form, repo URLs point to HakanSeven12/open-cad-studio. Logo (window
icon + assets/logo.svg) redrawn with OCS initials. Drop examples/
binaries — unused.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
This commit is contained in:
Hakan SevenandClaude Opus 4.7 committed 2026-05-23 17:16:15 +03:00
1 parent e2bc8c29eb
commit ef1f9a08d6
57 files changed
+159 -1301

No files matched your search

+2 -2
View File
@@ -1,9 +1,9 @@
use super::{Message, H7CAD};
use super::{Message, OpenCADStudio};
use crate::command::CmdResult;
use acadrust::Handle;
use iced::Task;
impl H7CAD {
impl OpenCADStudio {
pub(super) fn apply_cmd_result(&mut self, result: CmdResult) -> Task<Message> {
let i = self.active_tab;
match result {
+5 -5
View File
@@ -1,10 +1,10 @@
use super::{Message, H7CAD};
use super::{Message, OpenCADStudio};
use crate::command::CadCommand;
use crate::scene::Scene;
use iced::Task;
use std::path::PathBuf;
impl H7CAD {
impl OpenCADStudio {
pub(super) fn dispatch_command(&mut self, cmd: &str) -> Task<Message> {
let i = self.active_tab;
// Cancel any running command before starting a new one.
@@ -2524,7 +2524,7 @@ impl H7CAD {
}
"REPORT" => {
let _ = open::that("https://github.com/HakanSeven12/H7CAD/issues/new");
let _ = open::that("https://github.com/HakanSeven12/open-cad-studio/issues/new");
self.command_line.push_info("Opening GitHub issue page...");
}
@@ -2533,7 +2533,7 @@ impl H7CAD {
}
"CHANGELOG" => {
let _ = open::that("https://github.com/HakanSeven12/H7CAD/releases");
let _ = open::that("https://github.com/HakanSeven12/open-cad-studio/releases");
self.command_line.push_info("Opening release notes...");
}
@@ -4831,7 +4831,7 @@ impl H7CAD {
}
}
"SET" => {
let app = parts.get(1).copied().unwrap_or("H7CAD");
let app = parts.get(1).copied().unwrap_or("OpenCADStudio");
let val = parts.get(2).copied().unwrap_or("");
self.push_undo_snapshot(i, "XDATA SET");
for sh in &selected_handles {
+16 -9
View File
@@ -229,7 +229,7 @@ pub(super) fn title_case_word(value: &str) -> String {
// ── Window icon ────────────────────────────────────────────────────────────
/// Builds a 32×32 RGBA icon: red background with H7 drawn in white pixels.
/// Builds a 32×32 RGBA icon: red background with OCS drawn in white pixels.
pub(super) fn build_window_icon() -> Vec<u8> {
const W: usize = 32;
const SZ: usize = W * W * 4;
@@ -261,14 +261,21 @@ pub(super) fn build_window_icon() -> Vec<u8> {
}
}
// H
stroke(&mut px, 4, 5, 4, 26, fg);
stroke(&mut px, 13, 5, 13, 26, fg);
stroke(&mut px, 4, 15, 13, 15, fg);
// 7
stroke(&mut px, 17, 5, 27, 5, fg);
stroke(&mut px, 27, 5, 20, 26, fg);
stroke(&mut px, 20, 16, 26, 16, fg);
// O
stroke(&mut px, 3, 6, 9, 6, fg);
stroke(&mut px, 3, 25, 9, 25, fg);
stroke(&mut px, 3, 6, 3, 25, fg);
stroke(&mut px, 9, 6, 9, 25, fg);
// C
stroke(&mut px, 12, 6, 18, 6, fg);
stroke(&mut px, 12, 25, 18, 25, fg);
stroke(&mut px, 12, 6, 12, 25, fg);
// S
stroke(&mut px, 21, 6, 27, 6, fg);
stroke(&mut px, 21, 6, 21, 15, fg);
stroke(&mut px, 21, 15, 27, 15, fg);
stroke(&mut px, 27, 15, 27, 25, fg);
stroke(&mut px, 21, 25, 27, 25, fg);
px
}
+2 -2
View File
@@ -1,7 +1,7 @@
use super::{document::HistorySnapshot, H7CAD};
use super::{document::HistorySnapshot, OpenCADStudio};
use std::collections::HashSet;
impl H7CAD {
impl OpenCADStudio {
pub(super) fn history_label_from_active_cmd(&self, i: usize, fallback: &'static str) -> String {
self.tabs[i]
.active_cmd
+2 -2
View File
@@ -1,7 +1,7 @@
use super::H7CAD;
use super::OpenCADStudio;
use crate::ui;
impl H7CAD {
impl OpenCADStudio {
pub(super) fn sync_ribbon_layers(&mut self) {
let i = self.active_tab;
let active = self.tabs[i].active_layer.clone();
+9 -9
View File
@@ -44,7 +44,7 @@ pub struct OpenProgress {
// ── Application state ──────────────────────────────────────────────────────
pub(super) struct H7CAD {
pub(super) struct OpenCADStudio {
start: Instant,
tabs: Vec<DocumentTab>,
active_tab: usize,
@@ -697,7 +697,7 @@ pub enum Message {
ObjImportPath(Option<std::path::PathBuf>),
}
impl H7CAD {
impl OpenCADStudio {
fn new() -> Self {
// Boot with only the Welcome/Start tab. The user creates drawings
// explicitly (File → New); we never auto-spawn Drawing1.
@@ -855,9 +855,9 @@ impl H7CAD {
use std::path::PathBuf;
pub fn run() -> iced::Result {
iced::daemon(H7CAD::boot, H7CAD::update, H7CAD::view)
.subscription(H7CAD::subscription)
.title(|state: &H7CAD, window_id: window::Id| {
iced::daemon(OpenCADStudio::boot, OpenCADStudio::update, OpenCADStudio::view)
.subscription(OpenCADStudio::subscription)
.title(|state: &OpenCADStudio, window_id: window::Id| {
if Some(window_id) == state.layer_window {
return "Layer Properties Manager".into();
}
@@ -886,7 +886,7 @@ pub fn run() -> iced::Result {
return "Keyboard Shortcuts".into();
}
if Some(window_id) == state.about_window {
return "About H7CAD".into();
return "About Open CAD Studio".into();
}
if Some(window_id) == state.update_notice_window {
return "Update Available".into();
@@ -900,11 +900,11 @@ pub fn run() -> iced::Result {
if let Some(tab) = state.tabs.get(state.active_tab) {
let dot = if tab.dirty { "● " } else { "" };
let name = tab.tab_display_name();
format!("{}H7CAD — {}", dot, name)
format!("{}Open CAD Studio — {}", dot, name)
} else {
"H7CAD".to_string()
"Open CAD Studio".to_string()
}
})
.theme(|state: &H7CAD, _| state.active_theme.clone())
.theme(|state: &OpenCADStudio, _| state.active_theme.clone())
.run()
}
+2 -2
View File
@@ -1,11 +1,11 @@
use super::helpers::{entity_type_key, entity_type_label, title_case_word};
use super::{H7CAD, VARIES_LABEL};
use super::{OpenCADStudio, VARIES_LABEL};
use crate::linetypes;
use crate::scene::dispatch;
use crate::ui;
use acadrust::{EntityType, Handle};
impl H7CAD {
impl OpenCADStudio {
/// Rebuild the PropertiesPanel from the current entity selection.
/// Preserves UI state (open pickers, edit buffer) across refreshes.
pub(super) fn refresh_properties(&mut self) {
+4 -4
View File
@@ -1,7 +1,7 @@
use super::helpers::{
angle_close, ortho_constrain, parse_coord, polar_constrain, ucs_to_wcs, ucs_z_axis,
};
use super::{Message, H7CAD, POLY_START_DELAY_MS};
use super::{Message, OpenCADStudio, POLY_START_DELAY_MS};
use crate::modules::ModuleEvent;
use crate::scene::grip::{find_hit_grip, find_hit_grip_paper, GripEdit};
use crate::scene::object::GripApply;
@@ -31,7 +31,7 @@ fn format_size(bytes: u64) -> String {
}
}
impl H7CAD {
impl OpenCADStudio {
pub fn update(&mut self, msg: Message) -> Task<Message> {
match msg {
Message::Tick(t) => {
@@ -3414,7 +3414,7 @@ impl H7CAD {
Message::AboutCopyInfo => {
let info = format!(
"H7CAD v{}\nOS: {}\nArch: {}",
"Open CAD Studio v{}\nOS: {}\nArch: {}",
env!("CARGO_PKG_VERSION"),
std::env::consts::OS,
std::env::consts::ARCH,
@@ -4826,7 +4826,7 @@ impl H7CAD {
// ── DimStyle dialog helpers ─────────────────────────────────────────────────
impl H7CAD {
impl OpenCADStudio {
/// Populate all edit buffers from the currently selected dim style.
fn load_dimstyle_bufs(&mut self, tab: usize) {
let doc = &self.tabs[tab].scene.document;
+8 -8
View File
@@ -1,7 +1,7 @@
use super::document::DocumentTab;
use super::helpers::grid_plane_from_camera;
use super::history::history_dropdown_labels;
use super::{Message, H7CAD};
use super::{Message, OpenCADStudio};
use crate::scene::grip::{grips_to_screen, grips_to_screen_paper};
use crate::scene::paper_canvas::PaperCanvas;
use crate::scene::viewport_pane::{PaperViewportPane, ViewportPane};
@@ -16,7 +16,7 @@ use iced::{keyboard, Background, Border, Color, Element, Fill, Subscription, Tas
const VIEWCUBE_HIT_SIZE: f32 = VIEWCUBE_DRAW_PX;
impl H7CAD {
impl OpenCADStudio {
pub fn view(&self, window_id: window::Id) -> Element<'_, Message> {
// ── Floating panel windows ─────────────────────────────────────────
if Some(window_id) == self.layer_window {
@@ -1594,7 +1594,7 @@ fn unsaved_changes_dialog_window(name: &str) -> Element<'static, Message> {
// is the public welcome screen and stays consistent across locales.
//
// The page picks up the application icon's red-brown (#B03020) as a tint so
// it visually belongs to H7CAD without overpowering the dark workspace.
// it visually belongs to OpenCADStudio without overpowering the dark workspace.
const BRAND: Color = Color { r: 0.690, g: 0.188, b: 0.125, a: 1.0 }; // #B03020
const BRAND_DARK: Color = Color { r: 0.45, g: 0.12, b: 0.08, a: 1.0 };
@@ -1605,16 +1605,16 @@ pub(super) fn start_page_view<'a>() -> Element<'a, Message> {
const CARD_BG: Color = Color { r: 0.12, g: 0.12, b: 0.13, a: 1.0 };
const CARD_BORDER: Color = Color { r: 0.20, g: 0.20, b: 0.22, a: 1.0 };
// Brand-tinted "Welcome to" — the "H7CAD" word takes the accent colour
// Brand-tinted "Welcome to" — the "OpenCADStudio" word takes the accent colour
// (Thunderbird-style coloured headline split).
let headline = row![
text("Welcome to ").size(40).color(TEXT),
text("H7CAD").size(40).color(BRAND),
text("Open CAD Studio").size(40).color(BRAND),
]
.align_y(iced::Center);
let subtitle = text(
"H7CAD is an open-source CAD viewer and editor — a gift from contributors like you. \
"Open CAD Studio is an open-source CAD viewer and editor — a gift from contributors like you. \
Open a DWG/DXF file, start a new drawing, or help shape what comes next.",
)
.size(13)
@@ -1728,9 +1728,9 @@ pub(super) fn start_page_view<'a>() -> Element<'a, Message> {
let cards = row![
card_section(
"Free and open source",
"H7CAD belongs to its users.",
"Open CAD Studio belongs to its users.",
"Source is openly developed and distributed under a permissive licence. \
You are free to use, study, modify, and share H7CAD.",
You are free to use, study, modify, and share Open CAD Studio.",
),
card_section(
"Community driven",