首页 > 其他分享 >车载信息娱乐系统软件:Alpine IVI二次开发_(1).车载信息娱乐系统概述

车载信息娱乐系统软件:Alpine IVI二次开发_(1).车载信息娱乐系统概述

时间:2024-11-08 21:44:35浏览次数:3  
标签:std 娱乐 return int 假设 车载 IVI 二次开发 include

车载信息娱乐系统概述

在这里插入图片描述

什么是车载信息娱乐系统

车载信息娱乐系统(In-Vehicle Infotainment, IVI)是指安装在汽车内的多媒体系统,通常包括导航、音响、电话连接、互联网访问等功能。这些系统旨在为驾驶员和乘客提供丰富的信息和娱乐体验,同时确保行车安全和便利性。随着汽车技术的发展,IVI系统已经从简单的收音机和CD播放器演变为高度集成的智能平台,支持多种操作系统和应用。

IVI系统的发展历程

早期的IVI系统

早期的IVI系统主要集中在基本的音响和收音机功能上。20世纪80年代,汽车厂商开始在高端车型中引入CD播放器和卡带机。90年代,导航系统开始出现,但价格昂贵,普及率较低。

现代IVI系统

21世纪初,随着智能手机和互联网的普及,IVI系统开始集成更多功能,如蓝牙连接、电话拨号、多媒体播放等。近年来,IVI系统的发展迅速,支持多种操作系统(如Android Auto、Apple CarPlay)和智能助手(如Siri、Google Assistant)。现代IVI系统不仅提供基本的信息和娱乐功能,还支持车辆诊断、远程控制、OTA更新等高级功能。

IVI系统的主要组件

硬件组件

  1. 中央处理单元(CPU):负责处理各种计算任务,如导航计算、音频处理等。

  2. 显示屏幕:用于显示导航地图、音频信息、电话界面等。

  3. 输入设备:包括触摸屏、物理按钮、旋钮等,用于用户与系统交互。

  4. 音频系统:包括扬声器、放大器等,用于播放音频内容。

  5. 传感器:如GPS模块、陀螺仪、加速度计等,用于获取车辆位置和状态信息。

  6. 通信模块:如蓝牙、Wi-Fi、4G/5G模块,用于与外部设备通信。

软件组件

  1. 操作系统:如Linux、Android等,提供系统运行的基础环境。

  2. 中间件:如Genivi、Khronos等,提供硬件抽象层和应用开发框架。

  3. 应用层:包括导航应用、多媒体应用、电话应用等,直接面向用户的功能模块。

  4. 数据管理:用于存储和管理用户数据、车辆数据等。

  5. 用户界面:包括图形界面和语音界面,用于用户与系统交互。

IVI系统的功能模块

导航模块

导航模块是IVI系统的核心功能之一,通常包括地图显示、路线规划、交通信息等功能。导航模块需要与GPS模块和传感器紧密配合,以提供准确的位置信息和行驶建议。

示例:获取GPS位置信息

#include <iostream>

#include <string>

#include <gps.h> // 假设有一个GPS库



class GPSHandler {

public:

    GPSHandler() {

        // 初始化GPS模块

        if (gps_open("localhost", "2947", &gps_stream) == -1) {

            std::cerr << "无法连接到GPS模块" << std::endl;

            exit(1);

        }

    }



    ~GPSHandler() {

        // 关闭GPS模块

        gps_close(&gps_stream);

    }



    void getGPSPosition() {

        // 获取GPS位置信息

        if (gps_poll(&gps_stream) == -1) {

            std::cerr << "无法获取GPS位置信息" << std::endl;

            return;

        }



        struct gps_data_t *gps_data = &gps_stream.data;

        if (gps_data->status == STATUS_FIX) {

            std::cout << "当前位置: " << gps_data->fix.latitude << ", " << gps_data->fix.longitude << std::endl;

        } else {

            std::cout << "正在获取GPS位置信息..." << std::endl;

        }

    }



private:

    struct gps_stream gps_stream;

};



int main() {

    GPSHandler gpsHandler;

    gpsHandler.getGPSPosition();

    return 0;

}

多媒体模块

多媒体模块负责音频和视频的播放,通常包括FM/AM收音机、CD/DVD播放器、蓝牙音频、USB音频等功能。多媒体模块需要支持多种音频格式和播放控制。

示例:播放蓝牙音频

#include <iostream>

#include <bluetooth.h> // 假设有一个蓝牙库



class BluetoothAudioPlayer {

public:

    BluetoothAudioPlayer(const std::string &device_address) {

        // 连接蓝牙设备

        if (bt_connect(device_address) == -1) {

            std::cerr << "无法连接到蓝牙设备" << std::endl;

            exit(1);

        }

    }



    ~BluetoothAudioPlayer() {

        // 断开蓝牙连接

        bt_disconnect();

    }



    void playAudio() {

        // 播放蓝牙音频

        if (bt_play() == -1) {

            std::cerr << "无法播放蓝牙音频" << std::endl;

            return;

        }

        std::cout << "正在播放蓝牙音频..." << std::endl;

    }



private:

    int bt_fd; // 蓝牙文件描述符



    int bt_connect(const std::string &device_address) {

        // 连接蓝牙设备的代码

        // 假设返回-1表示连接失败,0表示成功

        return 0;

    }



    int bt_disconnect() {

        // 断开蓝牙连接的代码

        // 假设返回-1表示断开失败,0表示成功

        return 0;

    }



    int bt_play() {

        // 播放蓝牙音频的代码

        // 假设返回-1表示播放失败,0表示成功

        return 0;

    }

};



int main() {

    BluetoothAudioPlayer player("00:11:22:33:44:55");

    player.playAudio();

    return 0;

}

电话模块

电话模块负责处理电话连接和通话功能,通常包括蓝牙电话、USB电话、Wi-Fi电话等。电话模块需要支持多种通信协议和通话控制。

示例:接听蓝牙电话

#include <iostream>

#include <bluetooth.h> // 假设有一个蓝牙库



class BluetoothPhoneHandler {

public:

    BluetoothPhoneHandler(const std::string &device_address) {

        // 连接蓝牙设备

        if (bt_connect(device_address) == -1) {

            std::cerr << "无法连接到蓝牙设备" << std::endl;

            exit(1);

        }

    }



    ~BluetoothPhoneHandler() {

        // 断开蓝牙连接

        bt_disconnect();

    }



    void answerCall() {

        // 接听蓝牙电话

        if (bt_answer() == -1) {

            std::cerr << "无法接听蓝牙电话" << std::endl;

            return;

        }

        std::cout << "已接听蓝牙电话" << std::endl;

    }



private:

    int bt_fd; // 蓝牙文件描述符



    int bt_connect(const std::string &device_address) {

        // 连接蓝牙设备的代码

        // 假设返回-1表示连接失败,0表示成功

        return 0;

    }



    int bt_disconnect() {

        // 断开蓝牙连接的代码

        // 假设返回-1表示断开失败,0表示成功

        return 0;

    }



    int bt_answer() {

        // 接听蓝牙电话的代码

        // 假设返回-1表示接听失败,0表示成功

        return 0;

    }

};



int main() {

    BluetoothPhoneHandler handler("00:11:22:33:44:55");

    handler.answerCall();

    return 0;

}

互联网模块

互联网模块负责提供互联网连接和在线服务,通常包括Wi-Fi连接、4G/5G连接、在线音乐、在线导航等功能。互联网模块需要支持多种网络协议和数据传输。

示例:连接Wi-Fi网络

#include <iostream>

#include <wifi.h> // 假设有一个Wi-Fi库



class WiFiHandler {

public:

    WiFiHandler(const std::string &ssid, const std::string &password) {

        // 连接Wi-Fi网络

        if (wifi_connect(ssid, password) == -1) {

            std::cerr << "无法连接到Wi-Fi网络" << std::endl;

            exit(1);

        }

    }



    ~WiFiHandler() {

        // 断开Wi-Fi连接

        wifi_disconnect();

    }



    void checkConnection() {

        // 检查Wi-Fi连接状态

        if (wifi_is_connected()) {

            std::cout << "已成功连接到Wi-Fi网络" << std::endl;

        } else {

            std::cout << "未连接到Wi-Fi网络" << std::endl;

        }

    }



private:

    int wifi_fd; // Wi-Fi文件描述符



    int wifi_connect(const std::string &ssid, const std::string &password) {

        // 连接Wi-Fi网络的代码

        // 假设返回-1表示连接失败,0表示成功

        return 0;

    }



    int wifi_disconnect() {

        // 断开Wi-Fi连接的代码

        // 假设返回-1表示断开失败,0表示成功

        return 0;

    }



    bool wifi_is_connected() {

        // 检查Wi-Fi连接状态的代码

        // 假设返回true表示已连接,false表示未连接

        return true;

    }

};



int main() {

    WiFiHandler handler("MyWiFi", "MyPassword");

    handler.checkConnection();

    return 0;

}

车辆诊断模块

车辆诊断模块负责读取和解析车辆的诊断数据,通常包括发动机状态、轮胎压力、电池电压等。车辆诊断模块需要与车辆的CAN总线或其他诊断接口通信。

示例:读取发动机温度

#include <iostream>

#include <can.h> // 假设有一个CAN总线库



class VehicleDiagnosisHandler {

public:

    VehicleDiagnosisHandler() {

        // 初始化CAN总线

        if (can_open("/dev/can0", &can_fd) == -1) {

            std::cerr << "无法打开CAN总线设备" << std::endl;

            exit(1);

        }

    }



    ~VehicleDiagnosisHandler() {

        // 关闭CAN总线

        can_close(can_fd);

    }



    void readEngineTemperature() {

        // 读取发动机温度

        struct can_frame frame;

        if (can_read(can_fd, &frame) == -1) {

            std::cerr << "无法读取CAN总线数据" << std::endl;

            return;

        }



        // 假设发动机温度数据在frame.data[0]中

        int engine_temperature = frame.data[0];

        std::cout << "发动机温度: " << engine_temperature << "°C" << std::endl;

    }



private:

    int can_fd; // CAN总线文件描述符



    int can_open(const std::string &device, int *fd) {

        // 打开CAN总线设备的代码

        // 假设返回-1表示打开失败,0表示成功

        *fd = open(device.c_str(), O_RDWR);

        return *fd == -1 ? -1 : 0;

    }



    int can_close(int fd) {

        // 关闭CAN总线设备的代码

        // 假设返回-1表示关闭失败,0表示成功

        return close(fd) == -1 ? -1 : 0;

    }



    int can_read(int fd, struct can_frame *frame) {

        // 读取CAN总线数据的代码

        // 假设返回-1表示读取失败,0表示成功

        return read(fd, frame, sizeof(struct can_frame)) == -1 ? -1 : 0;

    }

};



int main() {

    VehicleDiagnosisHandler handler;

    handler.readEngineTemperature();

    return 0;

}

远程控制模块

远程控制模块负责通过互联网或其他通信方式远程控制车辆,通常包括远程启动、远程锁车、远程查看车辆状态等功能。远程控制模块需要与车辆的通信接口和云服务配合工作。

示例:远程启动车辆

#include <iostream>

#include <http_client.h> // 假设有一个HTTP客户端库



class RemoteControlHandler {

public:

    RemoteControlHandler(const std::string &vehicle_id, const std::string &api_key) {

        this->vehicle_id = vehicle_id;

        this->api_key = api_key;

    }



    void startVehicle() {

        // 发送远程启动请求

        std::string url = "https://api.carcontrol.com/v1/vehicles/" + vehicle_id + "/start";

        std::string headers = "Authorization: Bearer " + api_key;



        if (http_post(url, headers, "") == -1) {

            std::cerr << "远程启动失败" << std::endl;

            return;

        }

        std::cout << "远程启动成功" << std::endl;

    }



private:

    std::string vehicle_id;

    std::string api_key;



    int http_post(const std::string &url, const std::string &headers, const std::string &data) {

        // 发送HTTP POST请求的代码

        // 假设返回-1表示请求失败,0表示成功

        return 0;

    }

};



int main() {

    RemoteControlHandler handler("1234567890", "your_api_key_here");

    handler.startVehicle();

    return 0;

}

OTA更新模块

OTA(Over-The-Air)更新模块负责通过互联网远程更新IVI系统的软件,通常包括固件更新、应用更新、系统更新等功能。OTA更新模块需要与云服务和本地存储配合工作,确保更新过程的安全性和可靠性。

示例:检查OTA更新

#include <iostream>

#include <http_client.h> // 假设有一个HTTP客户端库

#include <json.h> // 假设有一个JSON解析库



class OTAUpdateHandler {

public:

    OTAUpdateHandler(const std::string &vehicle_id, const std::string &api_key) {

        this->vehicle_id = vehicle_id;

        this->api_key = api_key;

    }



    void checkForUpdates() {

        // 发送检查更新请求

        std::string url = "https://api.carcontrol.com/v1/vehicles/" + vehicle_id + "/updates";

        std::string headers = "Authorization: Bearer " + api_key;



        std::string response;

        if (http_get(url, headers, &response) == -1) {

            std::cerr << "检查更新失败" << std::endl;

            return;

        }



        // 解析响应

        json_object *json_obj = json_tokener_parse(response.c_str());

        if (json_obj == NULL) {

            std::cerr << "解析JSON失败" << std::endl;

            return;

        }



        json_object *update_available = json_object_object_get(json_obj, "update_available");

        if (json_object_get_type(update_available) == json_type_boolean && json_object_get_boolean(update_available)) {

            std::cout << "有可用的更新" << std::endl;

        } else {

            std::cout << "没有可用的更新" << std::endl;

        }



        json_object_put(json_obj);

    }



private:

    std::string vehicle_id;

    std::string api_key;



    int http_get(const std::string &url, const std::string &headers, std::string *response) {

        // 发送HTTP GET请求的代码

        // 假设返回-1表示请求失败,0表示成功

        return 0;

    }

};



int main() {

    OTAUpdateHandler handler("1234567890", "your_api_key_here");

    handler.checkForUpdates();

    return 0;

}

IVI系统的用户界面

图形界面

图形界面是IVI系统的主要交互方式之一,通常包括地图显示、音频控制、电话界面等。图形界面需要支持触摸屏操作,提供友好和直观的用户体验。

示例:显示地图

#include <iostream>

#include <map_renderer.h> // 假设有一个地图渲染库



class MapRenderer {

public:

    MapRenderer() {

        // 初始化地图渲染器

        if (initMapRenderer() == -1) {

            std::cerr << "无法初始化地图渲染器" << std::endl;

            exit(1);

        }

    }



    ~MapRenderer() {

        // 释放地图渲染器资源

        releaseMapRenderer();

    }



    void displayMap(double latitude, double longitude) {

        // 显示地图

        if (renderMap(latitude, longitude) == -1) {

            std::cerr << "无法显示地图" << std::endl;

            return;

        }

        std::cout << "地图已显示" << std::endl;

    }



private:

    int initMapRenderer() {

        // 初始化地图渲染器的代码

        // 假设返回-1表示初始化失败,0表示成功

        return 0;

    }



    int releaseMapRenderer() {

        // 释放地图渲染器资源的代码

        // 假设返回-1表示释放失败,0表示成功

        return 0;

    }



    int renderMap(double latitude, double longitude) {

        // 渲染地图的代码

        // 假设返回-1表示渲染失败,0表示成功

        return 0;

    }

};



int main() {

    MapRenderer renderer;

    renderer.displayMap(37.7749, -122.4194); // 旧金山的经纬度

    return 0;

}

语音界面

语音界面是IVI系统的另一个重要交互方式,通常包括语音识别、语音合成等功能。语音界面需要支持多种语言和方言,提供自然和流畅的语音交互体验。

示例:语音识别

#include <iostream>

#include <speech_recognition.h> // 假设有一个语音识别库



class SpeechRecognitionHandler {

public:

    SpeechRecognitionHandler() {

        // 初始化语音识别器

        if (initSpeechRecognizer() == -1) {

            std::cerr << "无法初始化语音识别器" << std::endl;

            exit(1);

        }

    }



    ~SpeechRecognitionHandler() {

        // 释放语音识别器资源

        releaseSpeechRecognizer();

    }



    std::string recognizeSpeech() {

        // 识别语音

        std::string recognized_text;

        if (speech_recognize(&recognized_text) == -1) {

            std::cerr << "语音识别失败" << std::endl;

            return "";

        }

        std::cout << "识别到的语音: " << recognized_text << std::endl;

        return recognized_text;

    }



private:

    int initSpeechRecognizer() {

        // 初始化语音识别器的代码

        // 假设返回-1表示初始化失败,0表示成功

        return 0;

    }



    int releaseSpeechRecognizer() {

        // 释放语音识别器资源的代码

        // 假设返回-1表示释放失败,0表示成功

        return 0;

    }



    int speech_recognize(std::string *recognized_text) {

        // 识别语音并返回识别结果的代码

        // 假设返回-1表示识别失败,0表示成功

        *recognized_text = "导航到旧金山";

        return 0;

    }

};



int main() {

    SpeechRecognitionHandler recognizer;

    std::string command = recognizer.recognizeSpeech();

    if (command == "导航到旧金山") {

        std::cout << "正在导航到旧金山..." << std::endl;

    } else {

        std::cout << "未知命令" << std::endl;

    }

    return 0;

}

语音合成

语音合成功能用于将文本转换为语音,通常用于导航提示、电话接听提示等。语音合成需要支持多种语言和发音风格,提供清晰和自然的语音输出。

示例:语音合成导航提示

#include <iostream>

#include <speech_synthesis.h> // 假设有一个语音合成库



class SpeechSynthesisHandler {

public:

    SpeechSynthesisHandler() {

        // 初始化语音合成器

        if (initSpeechSynthesizer() == -1) {

            std::cerr << "无法初始化语音合成器" << std::endl;

            exit(1);

        }

    }



    ~SpeechSynthesisHandler() {

        // 释放语音合成器资源

        releaseSpeechSynthesizer();

    }



    void speakText(const std::string &text) {

        // 合成并播放语音

        if (speech_synthesize(text) == -1) {

            std::cerr << "语音合成失败" << std::endl;

            return;

        }

        std::cout << "语音已播放: " << text << std::endl;

    }



private:

    int initSpeechSynthesizer() {

        // 初始化语音合成器的代码

        // 假设返回-1表示初始化失败,0表示成功

        return 0;

    }



    int releaseSpeechSynthesizer() {

        // 释放语音合成器资源的代码

        // 假设返回-1表示释放失败,0表示成功

        return 0;

    }



    int speech_synthesize(const std::string &text) {

        // 合成并播放语音的代码

        // 假设返回-1表示合成失败,0表示成功

        return 0;

    }

};



int main() {

    SpeechSynthesisHandler synthesizer;

    synthesizer.speakText("前方500米右转,到达目的地。");

    return 0;

}

IVI系统的安全性和可靠性

安全性

IVI系统的安全性至关重要,因为它们与车辆的控制系统紧密相连,任何安全漏洞都可能导致车辆被恶意控制。为了确保安全性,IVI系统通常采用以下措施:

  1. 数据加密:确保通信数据的安全,防止被窃听或篡改。

  2. 认证机制:通过用户认证和设备认证,确保只有授权用户和设备可以访问IVI系统。

  3. 防火墙:防止外部恶意攻击,保护IVI系统的网络连接。

  4. 安全更新:通过加密和签名确保OTA更新的安全性,防止恶意软件入侵。

可靠性

IVI系统的可靠性同样重要,因为它们在行车过程中提供关键功能。为了确保可靠性,IVI系统通常采用以下措施:

  1. 冗余设计:关键组件采用冗余设计,确保在某个组件故障时系统仍能正常运行。

  2. 故障检测:系统能够实时检测硬件和软件故障,并进行相应的处理。

  3. 稳定性测试:对IVI系统进行严格的稳定性测试,确保在各种环境下都能正常工作。

  4. 用户反馈:收集用户反馈,及时修复已知问题,不断改进系统性能。

IVI系统的未来趋势

人工智能集成

未来的IVI系统将更加智能化,集成更多的AI技术。例如,通过自然语言处理(NLP)技术,用户可以通过语音与系统进行更自然的交互;通过机器学习技术,系统可以更好地理解用户的需求和习惯,提供个性化的服务。

5G通信

5G技术的发展将使IVI系统能够提供更高速的互联网连接,支持更多的在线服务和实时数据传输。例如,通过5G网络,IVI系统可以实时获取交通信息、天气预报等,提供更精准的导航和行车建议。

车联网(V2X)

车联网(Vehicle-to-Everything, V2X)技术将使IVI系统能够与周边的车辆、基础设施等进行通信,提供更全面的行车信息。例如,通过V2X技术,IVI系统可以获取前方车辆的速度和位置信息,提供更安全的驾驶辅助。

个性化服务

未来的IVI系统将更加注重用户体验,提供个性化的服务。例如,通过用户的历史数据和偏好,系统可以自动调整音量、温度、座椅位置等,提供更加舒适的驾驶环境。

结论

车载信息娱乐系统(IVI)是现代汽车的重要组成部分,不仅提供了丰富的信息和娱乐功能,还增强了行车安全和便利性。随着技术的发展,IVI系统将变得更加智能、可靠和个性化,为驾驶员和乘客带来更好的体验。

标签:std,娱乐,return,int,假设,车载,IVI,二次开发,include
From: https://blog.csdn.net/zhubeibei168/article/details/143609307

相关文章

  • 车载信息娱乐系统软件:Alpine IVI二次开发_(2).Alpine IVI系统架构
    AlpineIVI系统架构1.系统概述AlpineIVI(In-VehicleInfotainment)系统是一种集成在汽车中的信息娱乐系统,旨在为驾驶员和乘客提供多媒体播放、导航、通信、互联网连接等多方面的功能。AlpineIVI系统不仅是一个硬件设备,更是一个复杂的软件生态系统,包括操作系统、中间件、......
  • 车载信息娱乐系统软件:Alpine IVI二次开发_(3).二次开发流程
    二次开发流程1.需求分析在进行AlpineIVI系统的二次开发之前,首先需要进行详细的需求分析。需求分析是确保项目成功的关键步骤,它帮助开发团队明确项目的目标、功能需求和性能指标。以下是需求分析的具体步骤和注意事项:1.1明确项目目标项目目标是二次开发的基础,开发团......
  • 车载诊断协议 --- DTC状态位0x20的原因
    我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。人就应该满脑子......
  • 东方娱乐周刊
    @目录一、征稿简介二、重要信息三、服务简述四、投稿须知一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述学科领域:人文社科-教育学、文学、艺术、体育、人文社科:其他四、投稿须知1.在线投稿:由艾思科蓝支持在线投稿,请将文章全文投稿至艾思科蓝投......
  • 车载清洁方案——无刷电机吸尘器方案
    无刷电机吸尘器是一款采用无刷电机驱动的高性能清洁工具,以其出色的吸尘效果和便捷的使用方式,受到了广大用户的欢迎。相比传统的有刷电机吸尘器,它具有更高的效率、更长的使用寿命和更低的噪音。下面,将为大家详细介绍无刷电机吸尘器方案的功能。一、无刷电机吸尘器功能介绍......
  • 车载清洁方案——无刷电机吸尘器方案
     无刷电机吸尘器是一款采用无刷电机驱动的高性能清洁工具,以其出色的吸尘效果和便捷的使用方式,受到了广大用户的欢迎。相比传统的有刷电机吸尘器,它具有更高的效率、更长的使用寿命和更低的噪音。下面,将为大家详细介绍无刷电机吸尘器方案的功能。 一、无刷电机吸尘器功能介绍......
  • 【GiraKoo】车载常用通信协议(CAN,ETH,LVDS)
    车载常用通信协议(CAN,ETH,LVDS)本文的主要来源是DeepSeek的开源AI大模型。可能存在一些错误或不准确的地方,请谨慎参考。特性CAN(ControllerAreaNetwork)以太网(Ethernet)LVDS(LowVoltageDifferentialSignaling)带宽低(最高1Mbps)高(1Gbps或更高)中等(......
  • 基于 C++ 的 UG/NX 二次开发环境配置
    基于C++的UG/NX二次开发环境配置参考教程:UG/NX二次开发环境配置方法(nx1980+vs2019)-CSDN博客NX二次开发VS环境搭建-怡宁塑胶模具设计-博客园(cnblogs.com)NX/UG二次开发环境配置方法—史上最详细版(以NX11.0和VisualStudio2017为例)_nx二次开发-CSDN博客在Windows......
  • CAD知识点概览 CAD数据交换与二次开发
    CAD知识点概览章节目录一、CAD基础概念与应用领域二、CAD软件界面与基本操作三、二维绘图与编辑四、尺寸标注与文字标注五、三维建模与编辑六、视图显示控制与打印输出七、图层管理与数据库管理八、CAD数据交换与二次开发九、CAD学习方法与资源推荐一、CAD基础概念与应用......
  • 10.24程序员节娱乐赛
    10.24程序员节娱乐赛前言10.24程序员节快乐,祝各位程序员新的一年里,代码如诗,bug无踪,算法神速,数据如龙,运维无忧,测试顺利,技术无界,创新不断!A题面不好写由于疫情原因,今年的天梯赛改在了11月28日进行。以下是今年天梯赛正式比赛的相关要求:竞赛时长为3小时。竞赛中3个不......