VC++与MFC实现CAD绘图软件:源码解析与二次开发实践
简介基于微软可视化C环境开发的仿AutoCAD绘图软件完整源代码面向计算机图形学、Windows应用编程与CAD设计方向的开发者和学生可用于课程设计、毕业设计或作为绘图工具的起步框架。项目实现了直线、圆、多边形、文字和圆弧等基础图元绘制并提供对象选取、编辑、删除、移动等交互功能涉及坐标系统换算、几何变换、消息响应、视图重绘与数据存储等关键环节能帮助读者将图形学知识整合为可运行程序。资源包总计一百五十七个文件含二十九个头文件、二十八份源文件以及编译产生的中间文件、二十一帧位图资源、多个光标图标、工程配置和资源脚本等整体压缩后仅四点三兆字节文件组织清晰便于按模块对照阅读。整套源码已有一千零四十九人浏览学习可掌握MFC单文档界面下菜单、工具栏、状态栏与图形区的协同工作方式也能深入分析图元对象封装、绘图消息路由、文件读写等实现细节对理解传统CAD软件内核颇具帮助。1. VC开发的CAD绘图软件源代码到底能让你拿到什么“VC开发的CAD绘图软件源代码.rar”这种包乍看是过气产物对从业者来说却是一份难得的MFC图形学解剖标本它把绘图、交互、数据存储和屏幕刷新完整串成了一条可编译的系统链路。真正想理解CAD软件底层运作的人缺的不是更复杂的算法而是从“点击鼠标”到“屏幕上出现线条”那一段被无数封装掩盖的电路。这个标题之所以值得拆是因为它触及了桌面绘图软件最核心的三个问题数据怎么存、命令怎么走、画面怎么刷。适合接手的读者是那些要自己做CAD、楼宇软件或矢量编辑器而不是只调第三方控件的开发者。2. 用VC打开一套CAD工程MFC文档视图与设备上下文里的绘图逻辑2.1 解压之后的工程结构先分清哪份代码管数据、哪份代码管显示拿到rar解开之后第一件事不是找MainFrm而是找工程里有没有“文档视图”结构。典型的MFC CAD源码会派生一个CDocument子类和一个CView子类前者负责图元数据的增删改查后者只负责把数据画到屏幕上。很多人翻代码翻得混乱就是因为没有先建立这条分界线Doc里面维护的是图形对象链表View里面维护的是鼠标交互和重绘逻辑。我在看这类工程时习惯先搜索“class 某视图类 : public CView”和“class 某文档类 : public CDocument”这两行。确认存在这两类之后整个源码的组织方式基本就清楚了菜单命令发给Doc改数据鼠标消息发给View做交互View在OnDraw里遍历Doc的图元容器。任何一个绘图对象的修改最终都由Doc通知View刷新。// 常见的文档类结构 class CCadDoc : public CDocument { protected: CObList m_entities; // 存放所有图元对象指针 public: void AddEntity(CEntity* pEntity); // 新增图元后调用 UpdateAllViews CEntity* HitTest(CPoint pt); // 根据屏幕坐标查找被点中的图元 };这里CObList是MFC自带的指针链表它不拷贝对象只存指针所以多态派生类放进链表不会丢类型信息。HitTest用屏幕坐标做遍历匹配找到第一个命中的图元就返回。这段代码里最值得学习的是AddEntity的设计它不直接在链表里塞指针完事而是调用UpdateAllViews触发所有视图重绘。这保证了多视图比如同时开俯视图和侧视图时数据变化能同步反映到每个窗口这也是MFC文档视图机制比自绘控件更适合CAD的地方。2.2 用CDC画一条带坐标系的直线设备上下文和画笔的最小代码视图类的OnDraw收到一个CDC指针这就是绘图的核心。老式CAD源码几乎都是直接在这个CDC上做GDI调用而不是贴一堆现成控件。理解这段代码是整个标题里“绘图软件”四个字的落点。void CCadView::OnDraw(CDC* pDC) { // 先取客户区尺寸决定是否重绘背景 CRect rcClient; GetClientRect(rcClient); pDC-FillSolidRect(rcClient, RGB(250, 250, 250)); // 浅灰背景 // 创建一支宽度为1的黑色画笔 CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); CPen* pOldPen pDC-SelectObject(pen); // 画一条从(100,100)到(400,300)的直线 pDC-MoveTo(100, 100); pDC-LineTo(400, 300); // 恢复旧画笔释放GDI对象 pDC-SelectObject(pOldPen); }MoveTo和LineTo组成一条线段这里没有用到任何第三方库纯Windows GDI就能完成。SelectObject换笔之后必须换回来否则GDI对象泄漏连续操作一段时间后绘图会越来越卡这是老代码里最常见的隐患之一。关于坐标映射很多初学者会把这里的100、400当成“图纸里的毫米”实际上它们是客户区坐标单位是像素。真正成熟的CAD源码会通过SetMapMode或自定义的缩放参数把逻辑坐标毫米/英寸换算成设备坐标像素。你在改这类代码时第一件事就是把坐标换算独立成两个函数逻辑转设备、设备转逻辑后面所有鼠标操作都会依赖它们。2.3 为什么不堆控件而用GDI矢量绘制决定了CAD软件的数据组织有人会问为什么CAD不用PictureBox控件或按钮拼界面而要自己写GDI答案是数据量。一张工程图的图元数量轻松上万控件只能显示静态内容无法支撑高频率的重绘和交互。CDC这套GDI机制是画到窗口客户区的每条线、每个圆都是立刻绘制的矢量指令重绘时只需要重新执行一遍遍历即可。class CEntity { public: virtual void Draw(CDC* pDC) 0; // 每个图元自己负责绘制 virtual CString GetTypeName() 0; // 调试或状态栏显示用 virtual void MoveOffset(int dx, int dy) 0; // 平移用供选择后拖动 };这种设计的关键是Draw是虚函数每个图元知道怎么画自己。线段画线、圆弧画弧、标注画文字。视图层不需要知道图元具体类型只需要遍历容器逐个调用Draw。这套多态结构就是后续“新增图形类型”的扩展点。提示看这种源码时建议先数一数CEntity派生了多少个子类。如果只有CLine和CCircle说明它是个教学骨架如果有一二十个子类说明它真的具备工程软件雏形。3. 从点击到生成图元鼠标交互与绘图状态机的实现细节3.1 用有限状态机管理绘图命令画线命令在三个鼠标回调里的流转鼠标交互是CAD体验的灵魂也是最容易写成一团浆糊的部分。我见过大量翻车代码把画线逻辑直接写在OnLButtonDown里点一下画一条线结果画出来全是端点相连的折线根本没法独立控制每条线段。正确做法是为每个绘图命令维护一个状态机。以画线为例它至少有三个状态等待起点、跟踪终点、完成线段。在MFC视图类里这三个状态恰好映射到三个鼠标回调void CCadView::OnLButtonDown(UINT nFlags, CPoint point) { if (m_currentCommand CMD_LINE) { if (m_bDrawing FALSE) { m_ptStart point; // 第一次点击记录起点进入跟踪状态 m_ptEnd point; m_bDrawing TRUE; SetCapture(); // 捕获鼠标避免拖出窗口后丢消息 } else { // 第二次点击把最终线段交给Doc并复位状态 CLine* pLine new CLine(m_ptStart, point); m_pDoc-AddEntity(pLine); m_bDrawing FALSE; ReleaseCapture(); } } CView::OnLButtonDown(nFlags, point); }m_bDrawing就是状态变量false代表等待下次点击作为起点true代表已经选了起点正在等终点。SetCapture很重要如果不捕获鼠标在绘图过程中移出客户区再移回来中间容易丢失鼠标抬起消息造成线条画不出来或卡在跟踪状态。ReleaseCapture则是在结束时必须对称归还的。这个状态机值得扩展如果按Esc取消应该把m_bDrawing复位并清掉预览线如果右键结束连续画线应该让用户可以连续画多段线。在命令行输入坐标的功能本质上就是改变状态的数据来源把point换成解析后的坐标即可。3.2 橡皮筋预览与R2_XORPEN交互反馈背后的绘制原理点击起点后鼠标移动时需要有一条“橡皮筋”跟着光标走但又要保证移动时不留下残影。最传统的做法是异或绘制模式在旧位置画一遍线把原像素复原再到新位置画一遍线显示预览。void CCadView::OnMouseMove(UINT nFlags, CPoint point) { if (m_bDrawing (nFlags MK_LBUTTON)) { CDC* pDC GetDC(); pDC-SetROP2(R2_XORPEN); // 异或模式重复画同一位置会擦除 CPen pen(PS_SOLID, 1, RGB(255, 255, 255)); // 白色画笔异或后变反色 CPen* pOldPen pDC-SelectObject(pen); pDC-MoveTo(m_ptStart); pDC-LineTo(m_ptLast); // 在上一位置画一遍擦掉旧线 pDC-MoveTo(m_ptStart); pDC-LineTo(point); // 在新位置画预览线 pDC-SelectObject(pOldPen); ReleaseDC(pDC); m_ptLast point; // 记住当前位置供下次擦除 } CView::OnMouseMove(nFlags, point); }这段逻辑的核心在于“画两遍等于擦除”的数学特性同一像素被异或两次后恢复原值。很多初改代码的人容易漏掉把m_ptLast更新这一步结果每次鼠标移动都在旧起点和最新位置之间画线残影越来越乱。这套方案的问题是一旦窗口被遮挡后重绘异或区域会残留杂色。现代CAD一般改用双缓冲加定时器重绘鼠标移动时只更新坐标变量然后Invalidate触发整体重绘利用后缓冲把所有预览线和其他图元重新画一遍虽然多花了CPU但画面干净利落。若是老旧源码还在用纯XOR你是可以直接升级成重绘方案的因为预览线本身要做到“无痕”靠整体重绘比靠异或清扫稳定得多。3.3 端点捕捉与图元拾取从鼠标像素到几何对象的换算拾取一个图元、捕捉一个端点这类操作本质上是做几何计算。鼠标点击的位置是设备坐标像素值而图元的存储坐标可能是逻辑坐标经过缩放和平移的绘图坐标。不做换算直接拿像素值去跟图元坐标比较结果就是“鼠标点哪都不准”。经典做法是分三步先把point从设备坐标转成逻辑坐标然后写一个HitTest函数去遍历图元判断距离阈值最后把命中的图元选中并高亮。距离阈值一般取5到8个像素换算成逻辑坐标时要乘上缩放比例的倒数。bool CLine::HitTest(const CPoint ptLogic, int tolerance) const { // 计算点到线段的距离小于容差值即命中 double dx m_ptEnd.x - m_ptStart.x; double dy m_ptEnd.y - m_ptStart.y; if (dx 0 dy 0) return abs(ptLogic.x - m_ptStart.x) tolerance; double t ((ptLogic.x - m_ptStart.x) * dx (ptLogic.y - m_ptStart.y) * dy) / (dx * dx dy * dy); if (t 0) t 0; // 若垂足在线段外取最近端点 if (t 1) t 1; double projX m_ptStart.x t * dx; double projY m_ptStart.y t * dy; double dist sqrt((ptLogic.x - projX) * (ptLogic.x - projX) (ptLogic.y - projY) * (ptLogic.y - projY)); return dist tolerance; }注意t值的钳制如果不限制在0到1之间垂足落到线段延长线上时也会被判定命中就会出现“点到空白处却选中了线段”的错觉。t的临界处理是从直线命中到线段命中的分界线也是这类拾取代码最容易犯的几何错误。4. 重绘与图形数据双缓冲、序列化与DXF输出的可落地改造4.1 让界面不再闪双缓冲绘图的最小实现老式单缓冲OnDraw在拖动图元时屏幕会不断闪烁原因很简单每次重绘都先擦白背景再逐个画图元这个过程用户肉眼可见。双缓冲的做法是先在一张内存位图上画完整个场景再一次BitBlt贴到屏幕中间过程用户看不到。void CCadView::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); // 1. 创建与客户区兼容的内存DC和位图 CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); CBitmap* pOldBmp memDC.SelectObject(bmp); // 2. 在内存DC上完成所有绘制 memDC.FillSolidRect(rcClient, RGB(250, 250, 250)); CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); for (POSITION pos m_pDoc-GetEntities().GetHeadPosition(); pos ! NULL; ) { CEntity* pEntity m_pDoc-GetEntities().GetNext(pos); pEntity-Draw(memDC); } // 3. 一次性贴回客户区 pDC-BitBlt(0, 0, rcClient.Width(), rcClient.Height(), memDC, 0, 0, SRCCOPY); // 4. 释放资源 memDC.SelectObject(pOldBmp); }这里最容易犯的错是忘记SelectObject恢复旧位图导致内存DC析构时连带释放仍在使用的GDI对象轻则绘图异常重则运行时崩溃。另外一个坑是每次OnDraw都创建和销毁位图开销不小高频交互场景下可以考虑把位图缓存起来只在窗口尺寸变化时重建。双缓冲不是说加了就稳了。如果你在内存DC上还是循环调用Draw虚函数Draw内部又做了复杂的缩放或裁剪性能瓶颈依然在遍历本身。第一个优化方向是空间索引比如把图元按网格分桶只重绘视野内的格子。4.2 从GDI换到GDI抗锯齿与半透明带来的显示差异老CAD源码的线条锯齿感非常明显尤其在低分辨率屏幕下。如果你改了界面高DPI适配会发现GDI画出来的斜线边缘毛刺非常重。改用GDI之后最大红利不是功能变多而是默认抗锯齿让观感提升一个档次。#include gdiplus.h #pragma comment(lib, gdiplus.lib) void CCadView::OnDraw(CDC* pDC) { Gdiplus::Graphics graphics(pDC-m_hDC); graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); // 开抗锯齿 Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0, 0), 1.0f); graphics.DrawLine(pen, 100, 100, 400, 300); }迁移的隐藏成本在于GDI的画笔宽度单位是设备像素GDI的Pen宽度单位是逻辑英寸DPI变化会让线宽表现完全不同。还有一个更隐蔽的问题GDI在内存DC上绘制没问题但如果你还想用CDC的旧接口做透明背景或复杂填充两种渲染模型混用会导致坐标偏移或颜色失真。我一般建议做渐进式迁移先让新建的图元走GDI路径旧的GDI绘制暂不删除验证视觉一致性后再整体切换。4.3 让图纸数据离开内存用DXF导出让其他软件能打开一个不能保存成通用格式的CAD软件是没有实用价值的。MFC的CArchive序列化只能让程序自己读自己用户如果想把图纸发给同事或导给其他工具就需要导出DXF。DXF本质是ASCII文本段落按段组织HEADER、ENTITIES等。最小可用的导出器只需要写ENTITIES段每个图元对应一组组码和数据行。void CLine::WriteDxf(FILE* fp) { fprintf(fp, 0\nLINE\n); // 实体类型标记 fprintf(fp, 8\n0\n); // 图层这里固定为0 fprintf(fp, 10\n%.4f\n, m_x1); // 起点X fprintf(fp, 20\n%.4f\n, m_y1); // 起点Y fprintf(fp, 30\n0.0\n); // 起点Z二维图固定为0 fprintf(fp, 11\n%.4f\n, m_x2); // 终点X fprintf(fp, 21\n%.4f\n, m_y2); // 终点Y fprintf(fp, 31\n0.0\n); }组码10、20、30代表起点坐标11、21、31代表终点坐标这是DXF规范约定死的。写导出器最常见的错误是忘了图层组码8或把整数坐标直接写进要求浮点的字段。导出之后用其他CAD软件打开验证是最快的排错手段。DXF导出还有一个绕不开的坑圆和圆弧的组码结构跟直线完全不同圆弧用组码10表示圆心、组码40表示半径、组码50表示起始角度单位是度而不是弧度。如果你的工程里有多种图元千万别用一个通用导出函数应付给每个图元类单独实现WriteDxf才是正路。5. 常见问题与排查老VC源码编译不过、白屏闪屏的避坑记录5.1 现象IDE提示一堆类型转换错误源码编译不过原因老代码一般基于老版工具链的MFC版本写成新版编译器的标准库头文件和MFC头文件对类型检查更严格尤其是CString到const char*的隐式转换、BYTE与bool的混用在旧编译器下只是警告在新编译器下直接报错。解决不要一行行硬改先集中处理三类问题。第一项目字符集切换到“使用多字节字符集”避免所有CString转换错误第二把SetWindowPos的UINT类型显式强转第三全局搜索“warning C4996”把_CRT_SECURE_NO_WARNINGS加到预处理器定义里。大多数老工程的编译错误都能被这三板斧扫掉八成。5.2 现象窗口拉伸后图形变成了白屏原因OnDraw只画了当时可见区域的内容或者图元数据存在视图类成员里窗口尺寸变化触发OnPaint时视图把数据清掉了。更常见的情况是拉伸时调用了Invalidate但OnDraw里用了GetClientRect之后的临时DC画了背景没有触发图元遍历。解决把图元容器的生命周期和视图类彻底解耦。所有图元必须由文档类持有视图只负责在OnDraw里遍历。另一个排查点是检查是否在OnEraseBkgnd里直接返回TRUE而不做填充这会让背景擦除和绘图顺序错乱表现为窗口整体白屏闪烁。老代码里OnEraseBkgnd的返回值玄学多半来自这套组合问题。5.3 现象画线交互时屏幕上残留大量橡皮筋残影原因OnMouseMove里用了异或绘制模式但在某种情况下没有成对擦除比如按下Alt键切换窗口、弹出右键菜单、或者窗口被遮挡后触发了重绘异或绘制的残余像素就留在屏幕上。解决不要依赖异或清扫。改用整体重绘鼠标移动时只保存“当前预览终点”这个成员变量然后调用Invalidate(TRUE)触发OnDraw在OnDraw的完整遍历后追加绘制预览线。虽然每次移动都要全量重绘但图元数量在中小型图纸时性能完全够用而且彻底告别残影问题。5.4 现象滚轮缩放之后鼠标点击的拾取位置总是不对原因图元存储用的是逻辑坐标鼠标消息返回的是设备坐标。滚轮缩放后两者之间的比例关系变了但HitTest里没有把point换算回逻辑坐标就直接比较。解决在所有鼠标交互回调的最前面统一调用一个坐标换算函数拿到逻辑坐标再用。换算公式为逻辑X (设备X - 滚动偏移X) / 缩放比例。要注意滚动偏移在MFC视图里可能来自GetScrollPos也可能来自你自己实现的平移量务必将这两部分统一到同一个变量存储。这里最容易翻车的是只算了缩放没算平移结果放大后点击位置偏移一段固定距离。5.5 现象序列化的图纸文件打不开打开后图形错位或缺内容原因文档类的Serialize里读写顺序不一致或者新增图元类型后没有处理老版本文件。CArchive读出来的是一个老版本的图元但新代码里的构造函数多了一个颜色或线宽成员读的时候漏读导致后续所有图元错位。解决打开这类老工程的第一时间就要在Serialize里给文件加版本号。读文件时先读int版本号然后分版本走不同读取分支。新增字段的图元类构造函数要给老字段设默认值保证文件的向后兼容。这个习惯越早建立后期迭代越省心否则你会被“用户图纸打不开”的问题反复折磨。6. 把这份老CAD源码变成自己的设计工具二次开发落地的三个技巧拿到这套源码之后真正有价值的动作不是原样编译而是改造成符合自己需要的工具。第一个值得动手的功能是增加一个“矩形”命令你需要做的只有三件事在CEntity下方新增一个CRectEntity类并实现Draw与Serialize在视图类的OnLButtonDown里给状态机增加CMD_RECT分支在菜单或快捷键里绑定这个命令。这一整套流程走通你就会彻底理解CAD的命令分发机制。第二个值得做的改造是接入命令行输入。很多老源码的坐标输入靠鼠标点击设计师需要的却是键盘精度。你可以在视图类里捕获WM_KEYDOWN把输入的字符串攒成一个缓冲区回车时用sscanf或CString::Tokenize解析出两个double类型的X、Y坐标然后当作一次“虚拟鼠标点击”交给绘图状态机。改造时注意区分输入法焦点和视图焦点否则数字键会被对话框吃掉。第三个能立竿见影的验证性功能是导出为DXF后重新导入。做好了导出再去实现导入你等于给这套源码配备了一个外部文件接口可以用它批量生成测试图纸也可以拿来自动化检测绘图逻辑的准确性。我的习惯是每加一个图元类型就立刻生成一个DXF样例用其他软件打开对比坐标和样式这一步能过滤掉大部分几何计算错误。这套老架构的灵魂不在某一段具体绘图代码而在于它的分层方式数据、命令、显示、持久化各司其职。你在这个基础上做的每一次改造都是在往一个真正可用的CAD工具方向推进而不是在维护一堆死代码。希望这些经验能帮到你少走几步我当年绕过的弯路。本文还有配套的精品资源点击获取

相关新闻

QPython Plus资源管理机制与OpenCV移动端部署指南

QPython Plus资源管理机制与OpenCV移动端部署指南

简介:本资源是面向Android移动开发者的Python轻量级运行环境增强包,专为在手机端开展Python 3编程学习与GUI应用开发而优化。它基于QPython Plus深度定制,预装Python 3.12.11解释器并原生支持Tkinter图形库,使用户无需PC即可编写、…

2026/10/16 18:32:12 阅读更多 →
Quartz集群生产落地:JDBCJobStore深度调优与避坑指南

Quartz集群生产落地:JDBCJobStore深度调优与避坑指南

1. 为什么Quartz的默认内存存储在生产环境里根本不能用刚接手某电商后台定时任务模块时,我看到配置文件里写着org.quartz.jobStore.class org.quartz.simpl.RAMJobStore,心里就咯噔一下。这不是把所有任务都塞进JVM堆内存里了吗?当时团队还觉…

2026/10/16 18:32:11 阅读更多 →
Hive窗口函数性能陷阱与优化实战指南

Hive窗口函数性能陷阱与优化实战指南

1. 问题现场还原:那个让整张报表卡住的窗口函数上周五下午三点,某数据中台团队的看板突然告警——一张核心日活漏斗表的ETL任务超时,重试三次后失败。运维同学甩来日志截图,最后一行赫然写着:FAILED: Execution Error,…

2026/10/16 18:32:11 阅读更多 →

最新新闻

咸阳近视手术医院医生推荐:屈光团队资质与术式储备怎么看

咸阳近视手术医院医生推荐:屈光团队资质与术式储备怎么看

咸阳近视手术医院医生推荐怎么用?很多咸阳患者搜到一堆机构名单,却不知道从哪里比起。本文换一个角度:先讲清楚判断"医院医生好不好"的具体标准,再以西安普瑞眼科医院屈光专科为例做对照说明,帮助咸阳摘镜人…

2026/10/16 19:01:54 阅读更多 →
JDK 7u80 Linux x64 部署与JVM调优实战指南

JDK 7u80 Linux x64 部署与JVM调优实战指南

简介:jdk-7u80-linux-x64.tar.gz是Oracle官方发布的Java Development Kit 1.7在Linux x64环境下的正式版压缩包,面向需要部署Java应用或进行Java开发的中高级开发者,尤其适合对内存容量有较高要求的服务器、大数据处理场景。该安装包共包含20…

2026/10/16 19:01:54 阅读更多 →
电脑清理软件哪家实力强 技术研发与资质实力盘点

电脑清理软件哪家实力强 技术研发与资质实力盘点

电脑清理软件厂商实力评估维度说明当前市场上电脑清理类工具品类繁杂,不同产品的清理能力、安全性、适配性差异较大,普通用户选型时容易陷入“只看广告不看实力”的误区,最终选到带捆绑插件、误删文件甚至携带病毒的工具。对于有批量采购需求…

2026/10/16 19:01:54 阅读更多 →
从分子到患者:数字主线,生命科学行业穿越周期的确定性

从分子到患者:数字主线,生命科学行业穿越周期的确定性

导语一款创新药物,从实验室里的一个分子式,到患者手中的一个包装盒,中间要穿过药物发现、工艺开发、技术转移、原料药与制剂生产等重重关卡。过去二十年,行业的每一次进步,几乎都在拉长这条链路:生物药比小…

2026/10/16 19:01:54 阅读更多 →
TurtleBot3导航实战:从仿真SLAM建图到参数调优

TurtleBot3导航实战:从仿真SLAM建图到参数调优

简介:Turtlebot3-master.zip 是一份面向 ROS 学习者的 Turtlebot3 仿真环境资源包,适合在 Ubuntu 上搭建机器人开发与算法验证环境,尤其适用于 SLAM、导航和避障等方向的入门与进阶实践。压缩包共 127 个文件、约 6.56MB,涵盖 26 …

2026/10/16 19:01:54 阅读更多 →
2026年Agent开发爆发!小白程序员必备,收藏学习拿高薪!

2026年Agent开发爆发!小白程序员必备,收藏学习拿高薪!

随着AI技术的快速发展,Agent开发和AI大模型领域成为就业热点。传统软件开发需求下降,而AI相关岗位需求激增。 2026年,Agent开发爆发了! 阿里大厂的大佬直接挑明:今年都要求有AI相关经验! 如果你还沉浸在只要…

2026/10/16 19:00:54 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →