根据文本自动生成UML时序图(draw.io格式)-支持自动换行

用UML建模电力与智能电网标准:从CIM到IEC 61850 UML(统一建模语言)作为软件工程中用于可视化、规约和构造系统模型的标准语言,其类图、时序图、状态机图等为复杂系统提供了统一的描述框架。在电力与智能电网领域,IEC 61970、IEC 61968和IEC 61850等标准定义了庞大的数据模型与通信协议,CIM(通用信息模型)作为核心语义层,通常以UML包和类图形式组织。利用UML表达行业标准,能够将千页标准文档转化为结构化的类图、时序图和状态机图,有效消除语义歧义,支撑模型驱动开发与跨系统集成。实践中,工程师可通过Enterprise Architect、 阅读详情
AI摘要

本文介绍了一款用Java开发的工具,能根据文本自动生成UML时序图,支持draw.io格式,语法简洁,适用于Java代码自动生成。工具提供命令行和Java项目中使用的方式,支持描述、生命线、消息、链接和注释等元素,且能自动计算高度,方便编辑。此外,还详细阐述了输入文本格式和配置参数。

1. 前言

已有一些工具可以根据文本自动生成 UML 时序图,如 PlantUML(https://plantuml.com/zh/)、Mermaid(https://mermaid-js.github.io/mermaid/)等。但存在一些使用不便之处,例如激活需要手工指定、语法较复杂,不便于记忆、部分功能使用频率较低、不便于人工继续编辑、展示的样式与常见的 UML 时序图不同等。

因此使用 Java 开发了以下根据文本自动生成 UML 时序图的工具,激活能够自动生成、语法简单便于记忆,支持大部分 UML 时序图的功能、生成 draw.io 格式文件,可以继续编辑、展示的样式与常见的 UML 时序图一致。

本工具生成的 UML 时序图相关的术语及样式参考了 https://www.uml-diagrams.org/sequence-diagrams.html,支持的元素包括:生命线(Lifeline)、激活(Execution/Activation)、消息(Message)。

当前项目可用于为 Java 代码自动生成 UML 时序图,可参考 https://github.com/Adrninistrator/gen-java-code-uml-sequence-diagram。

2. 更新说明

  • 0.1.0

支持根据消息文本计算所需高度,不再需要人工指定统一固定高度

  • 0.1.1

检查输入文件编码是否为 UTF-8-BOM

  • 0.1.2

自调用消息背景色设置为透明

  • 1.0.2

消息与生命线方框中的文本支持自动换行,根据文本计算对应元素需要占用的宽度与高度

删除 ~usddi_conf/position.properties 配置文件中的参数

# 生命线的方框宽度(非空)
lifeline.box.width
# 生命线的方框高度(非空)
lifeline.box.height
  • 1.0.3

返回消息支持为空

  • 1.0.4

处理新的部分没有指定返回内容时,提示对应行的信息

3. 示例

3.1. 示例 - 基本

以下为本工具生成的 draw.io 格式的 UML 时序图:

在这里插入图片描述

生成以上 UML 时序图的文本如下:

>><font color="#0000ff"><u > 这是一个描述 </u></font><br>end~ 这是一个链接
@<font style="font-size: 14px" face="幼圆" color="#000000"><b><i > 小明 </i></b></font> as xm
@爸爸
@妈妈 as mm
@老师
@请假 <br> 系统 as qjxt
xm=>xm:<strike> 今天不想上学了 </strike>
xm-> 妈妈:<font style="font-size: 18px" face="微软雅黑" color="#000000"> 妈妈我今天不想上学了 < br > 我肚子不舒服 </font>
xm=>mm:			<b> 妈妈我今天肚子不舒服 < br > 帮我找老师请个假 </b>
mm=> 老师: 小明今天不舒服 <br> 想请个假
妈妈 <= 老师:<font style="font-size: 16px" face="幼圆" color="#0000ff"><b><i > 稍等我查一下记录 < br > 等会回复你 </i></b></font>
xm<= 妈妈:<u> 老师说要等一会 </u>

老师 => 老师: 让我看看小明的请假记录~ https://www.baidu.com
老师 =>qjxt: 查询小明的请假记录
老师 <= 请假 < br> 系统: 返回数据 < br > 今年共请假 0 次
老师 => 妈妈: 那就让他休息一天吧
老师 <= 妈妈: 谢谢老师

妈妈 ->xm: 老师同意你请假了

默认会为每个消息自动添加序号,可以通过后续说明的配置关闭。

将鼠标移到生命线或激活上方后,会显示对应生命线的描述,便于在时序图较长时查看。

3.2. 示例 - 彩色

通过配置文件可以指定生命线、消息、激活等元素的线条、背景、文字颜色,示例如下:

在这里插入图片描述

3.3. 示例 - 自动换行

从 1.0.2 版本开始,消息与生命线方框中的文本支持自动换行,根据文本计算对应元素需要占用的宽度与高度,示例如下:

在这里插入图片描述

4. 根据文本文件生成 UML 时序图

本工具代码地址为: https://github.com/Adrninistrator/uml-sequence-diagram-drawio/ 或 https://gitee.com/Adrninistrator/uml-sequence-diagram-drawio/ 。

4.1. 使用方式

使用本工具的操作系统中需要安装 JDK,并在环境变量中配置对应目录。

4.1.1. 通过命令行执行

可从以下地址下载本工具并解压:

https://github.com/Adrninistrator/uml-sequence-diagram-drawio/releases/

https://gitee.com/Adrninistrator/uml-sequence-diagram-drawio/releases/

在 Windows 环境执行时,可在命令行执行以下命令,参数 1 为文本文件路径(可在资源管理器中将文件拖放到命令行窗口中):

run.bat [文本文件路径]

在开头有文本文件的内容示例,在后续有格式说明,文本文件可使用任意后缀名。

在 Windows 环境执行时,还可将文本文件拖动到 run.bat 图标上执行,操作更简单。

在 Linux 等环境执行时,可在命令行执行以下命令,参数 1 为文本文件路径:

sh run.sh [文本文件路径]

执行完毕后,会在文本文件路径所在目录下生成对应的 draw.io 格式的 UML 时序图文件。

4.1.2. 在 Java 项目中执行

在 Java 项目中执行本工具时,可以通过以下方式引入本工具:

  • Gradle
testImplementation 'com.github.adrninistrator:uml-sequence-diagram-drawio:1.0.4'
  • Maven
<dependency>
  <groupId>com.github.adrninistrator</groupId>
  <artifactId>uml-sequence-diagram-drawio</artifactId>
  <version>1.0.4</version>
  <type>provided</type>
</dependency>

执行 com.adrninistrator.usddi.runner.RunnerGenUmlSequenceDiagram 类,generate() 方法,可以根据指定的文本文件,生成对应的 draw.io 格式的 UML 时序图文件,也可以使用 main() 方法

代码示例可参考 test.usddi.genbytext.TestGenDrawIoByTextFile 类:

runnerGenUmlSequenceDiagram.generate("src/test/resources/example/example.txt");

4.2. 输入文本要求

4.2.1. 输入文本关键字

以下关键字用于指定描述:

>>

以下关键字用于指定生命线的名称:

@
as

以下关键字用于指定消息:

=>
<=
->
:

以下关键字用于对描述或消息指定链接:

~

以下关键字用于指定注释:

#

4.2.2. 输入文本格式

4.2.2.1. 描述格式

描述是指时序图最上部用于说明的文字,与时序图没有关联,仅起说明作用。

  • >>description

使用 “>>description” 格式指定描述,“description” 为描述的内容,可指定任意内容;

描述需要在输入文本的最前面指定,只能指定一个描述,也可以不指定。

可使用 HTML 标签设置描述内容的样式,如换行等,可参考后续内容。

4.2.2.1.1. 链接格式
  • >>description~link

使用 “~link” 格式指定描述对应的链接,“link” 为链接的内容;

点击指定了链接的描述内容后,会显示对应的链接,如下所示:

在这里插入图片描述

链接内容可以指定为一般的文字,也可以指定为 URL 或文件路径(file://),如下所示:

file://C:\Windows\System32\calc.exe
file://C:\Windows\system.ini
https://www.baidu.com

当链接内容指定为 URL 时,点击链接时会使用默认浏览器打开对应 URL;

当链接内容指定为文件路径,点击链接时会使用对应文件格式的默认软件打开文件,若对应文件格式未指定默认软件,则不会打开,需要先设置。

4.2.2.2. 生命线格式

在输入文本中前面的内容(若有指定描述,则在描述之后),使用以下格式指定生命线,生命线在输入文本中出现的顺序(从上往下)与在 UML 时序图中的展示顺序(从左往右)一致。

  • @name

使用 “@name” 格式指定生命线,“name” 为生命线的名称;

  • @name as alias

为了简化生命线名称,可使用 “@name as alias” 格式指定生命线的名称,及别名,“alias” 为生命线的别名;

4.2.2.3. 消息格式

在输入文本中后面面的内容,使用以下格式指定消息,消息在输入文本中出现的顺序(从上往下)与在 UML 时序图中的展示顺序(从上往下)一致。

以下的 “~L” 为可选数据,如果不需要为消息指定链接则不需要指定。

  • x=>y:m~L

使用 “x=>y:m~L” 格式指定同步请求消息;

“x” 为起点生命线的名称或别名,“y” 为终点生命线的名称或别名,“m” 为消息内容;

  • x<=y:m~L

使用 “x<=y:m~L” 格式指定返回消息;

“y” 为起点生命线的名称或别名,“x” 为终点生命线的名称或别名,“m” 为消息内容;

同步请求消息与返回消息需要在正确的位置成对出现;

  • x=>x:m~L

使用 “x=>x:m~L” 格式指定自调用消息;

“x” 为生命线的名称或别名,“m” 为消息内容;

  • x->y:m~L

使用 “x->y:m~L” 格式指定异步消息;

“x” 为起点生命线的名称或别名,“y” 为终点生命线的名称或别名,“m” 为消息内容;

4.2.2.3.1. 链接格式

以上消息内容中的 “L” 为链接,可以不指定,格式已在前文说明;

为消息指定链接后的示例如下:

在这里插入图片描述

4.2.2.4. 注释格式

在输入文本中,以 “#” 开头的行代表注释。

4.2.2.5. 时序图开始新的部分格式

有时可能需要在一个时序图中展示多个不同部分的时序图,例如在部分 1 中消息最初的起点对应生命线 1,在部分 2 中消息最初的起点对应生命线 2,在这种情况下,可在每个部分的消息之间指定一个或多个空行,如下所示:

部分 1 消息
部分 1 消息
...
部分 1 消息

部分 2 消息
部分 2 消息
...
部分 2 消息

4.2.3. 输入文本编码

输入文本文件编码需要是 UTF-8 无 BOM。

4.2.4. 消息顺序的要求

本工具通过栈控制各类消息的处理,因此文本中指定的消息顺序需要符合一定要求,否则无法生成最终的时序图。

当处理到同步请求消息时,会将当前同步请求消息入栈

当处理到返回消息,会将栈顶消息出栈

当处理到自调用消息及异步消息时,不会进行入栈或出栈处理

对于异步消息的终点,不支持作为下一条消息的起点。

4.3. 参数配置

4.3.1. 位置相关参数

位置相关参数在配置文件 “~usddi_conf/position.properties” 中指定,如下所示:

参数名称参数作用是否允许为空默认值
lifeline.center.horizontal.spacing生命线中间点的水平间距非空无
message.vertical.spacing消息(及与生命线之间)垂直间距非空无
self.call.horizontal.width自调用消息的水平宽度非空无
activation.width激活的宽度非空无
parts.extra.vertical.spacing两个部分之间的额外垂直间距可选0

生命线方框的宽度、高度,消息的高度根据消息字体大小与消息长度计算得出,不需要人工指定

4.3.2. 位置相关参数示例

位置相关参数示例如下所示:

在这里插入图片描述

4.3.3. 样式相关参数

样式相关参数在配置文件 “~usddi_conf/style.properties” 中指定,如下所示:

参数名称参数作用是否允许为空默认值
message.auto.seq自动为消息添加序号可选是
line.width.of.lifeline线条宽度 - 生命线可选1
line.width.of.activation线条宽度 - 激活可选1
line.width.of.message线条宽度 - 消息可选1
line.color.of.lifeline线条颜色 - 生命线可选黑色
line.color.of.activation线条颜色 - 激活可选黑色
line.color.of.message线条颜色 - 消息可选黑色
box.color.of.lifeline方框背景颜色 - 生命线可选白色
box.color.of.activation方框背景颜色 - 激活可选白色
text.font.of.lifeline文字字体 - 生命线可选Helvetica
text.font.of.message文字字体 - 消息可选Helvetica
text.size.of.lifeline文字大小 - 生命线可选12
text.size.of.message文字大小 - 消息可选12
text.color.of.lifeline文字颜色 - 生命线可选黑色
text.color.of.message文字颜色 - 消息可选黑色

颜色相关的参数,应为 RGB 颜色十六进制形式,即 “#xxxxxx”,如 “#00ff00”;

文字字体相关的参数,应指定字体的名称,如 “宋体”、“Times New Roman”;

线条宽度相关的参数,支持整数或小数;

文字大小相关的参数,支持整数。

4.4. 为某个生命线名称、消息内容文字指定样式

以上样式相关参数是对一个 UML 时序图内统一的参数配置,当需要为某个生命线名称、消息内容文字单独指定样式时,可以按照以下方式实现:

4.4.1. 文字字体、大小、颜色

文字字体、大小、颜色可通过 HTML 中的 font 标签进行设置,如下所示:

<font face="宋体" style="font-size: 18px" color="#ff9999">xxx</font>
  • 文字字体
<font face="宋体">xxx</font>
  • 文字大小
<font style="font-size: 18px">xxx</font>
  • 文字颜色
<font color="#ff9999">xxx</font>

4.4.2. 加粗、斜体、下划线、删除线

文字加粗、斜体、下划线、删除线可通过 HTML 中的标签进行设置,如下所示:

  • 加粗
<b>xxx</b>
  • 斜体
<i>xxx</i>
  • 下划线
<u>xxx</u>
  • 删除线
<strike>xxx</strike>
  • 多个样式
<b><i><u><strike>xxx</strike></u></i></b>

同时指定文字字体、大小、颜色,及加粗、斜体、下划线、删除线时,如下所示:

<font face="宋体" style="font-size: 18px" color="#ff9999"><b><i><u><strike>xxx</strike></u></i></b></font>

4.4.3. 文字换行

当需要使文字换行时,使用以下内容作为换行符:

<br>

不使用 p 标签作为换行符

4.5. 使用建议

4.5.1. 增加注释提高可读性

假如用于生成 UML 时序图的文本内容太多时,会影响可读性,可通过增加注释的方式,根据消息的作用对消息进行分段,增加可读性

例如文本内容如下:

@步骤 1 as s1
@步骤 2 as s2
@步骤 3 as s3
@步骤 4 as s4
s1=>s2:1
s1<=s2:2
s1=>s1:1
s1=>s1:2
s1=>s1:3
s1=>s1:4
s1=>s2:1
s2=>s3:2
s3=>s4:3
s4=>s4:1
s4=>s4:2
s3<=s4:3
s2<=s3:2
s1<=s2:1

增加注释后如下,可以看出对可读性有提升:

@步骤 1 as s1
@步骤 2 as s2
@步骤 3 as s3
@步骤 4 as s4
# 阶段 1
s1=>s2:1
s1<=s2:2
# 阶段 2
s1=>s1:1
s1=>s1:2
s1=>s1:3
s1=>s1:4
# 阶段 3
s1=>s2:1
s2=>s3:2
s3=>s4:3
s4=>s4:1
s4=>s4:2
s3<=s4:3
s2<=s3:2
s1<=s2:1

注意,增加文本可读性时需要使用注释 “#”,不能使用空行,否则会当作时序图需要开始新的部分

4.5.2. 使用文本编辑器语法高亮

为了进一步提高用于生成 UML 时序图的文本的可读性,可将文本文件的后缀名修改为 “.md”,使用 Notepad++、VS Code 等支持 html 语法高亮的文本编辑器进行编辑。

5. 在 Java 项目中生成 UML 时序图

调用上述 Java 组件提供的 RunnerGenTextFile4USD 类,可以生成用于生成 UML 时序图的文本文件,再根据文本文件生成 UML 时序图,该类提供的方法说明如下:

方法名功能
init初始化
writeDescription设置描述
writeComment添加注释
addReqMessage添加同步请求消息
addRspMessage添加返回消息
addSelfCallMessage添加自调用消息
addAsyncMessage添加异步请求消息
write2File将添加的数据写入文件

在使用 RunnerGenTextFile4USD 类时,需要先调用 init 方法,指定需要生成的文本文件路径,之后根据需要添加注释或消息,最后调用 write2File 方法将添加的数据写入文件。

RunnerGenTextFile4USD 类的使用示例如下所示,可参考 test.usddi.gen_text_file.TestGenTextFile4USD 类。

String filePath = "test-" + System.currentTimeMillis() + ".txt";
System.out.println(filePath);

RunnerGenTextFile4USD runnerGenTextFile4USD = new RunnerGenTextFile4USD();

try (BufferedWriter writer = runnerGenTextFile4USD.init(filePath)) {
    // 设置描述
    runnerGenTextFile4USD.writeDescription("description", "descriptionLink");

    // 添加注释
    runnerGenTextFile4USD.writeComment("111");
    runnerGenTextFile4USD.writeComment("222");
    runnerGenTextFile4USD.writeComment("333");

    // 添加不同类型的消息
    runnerGenTextFile4USD.addReqMessage("a", "b", "请求 1");
    runnerGenTextFile4USD.addRspMessage("a", "b", "返回 1");
    runnerGenTextFile4USD.addSelfCallMessage("a", "自调用 1<br>aaa");
    runnerGenTextFile4USD.addAsyncMessage("a", "c", "异步请求 1<br>bbb");

    // 将添加的数据写入文件
    runnerGenTextFile4USD.write2File();

    // 根据文本生成 UML 时序图文件
    new RunnerGenUmlSequenceDiagram().generate(filePath, filePath + USDDIConstants.EXT_DRAWIO);
} catch (Exception e) {
    e.printStackTrace();
}

6. 生成的. drawio 文件使用方式

6.1. 直接打开. drawio 文件

从以下地址可以下载 draw.io 桌面版软件:

https://github.com/jgraph/drawio-desktop/releases

本工具生成的. drawio 文件可使用 draw.io 软件打开并编辑。

6.2. 复制. drawio 文件的 XML 内容

复制本工具生成的. drawio 文件的 XML 内容,在 draw.io 桌面版或网页版中,打开 “其他 -> 编辑绘图”,或 “Extras->Edit Diagram” 菜单,可以粘贴到当前打开的 draw.io 文件中。

UML图及在drawio中的绘制 UML——UnifiedModelingLanguage——统一建模语言,是业务建模阶段最常用和最重要的一种视图。 阅读详情

相关推荐

架构师必须掌握的画图工具draw.io、文本绘图(PlantUML)(架构图、UML图、流程图、时序图)

今天,我将为大家解锁两种强大易用的画图工具,助你在架构设计之路上乘风破浪、披荆斩棘。 首先是draw.io,这款在线绘图工具以其丰富的预设模板和强大的定制能力深受广大技术人群喜爱,无论是绘制复杂的系统架构图还是精巧的UML类图,都能游刃有余。既支持在线画图,也支持离线画图! 其次,我们还将探讨语雀中的文本绘图工具,特别是支持PlantUML语法的特性,让你可以通过简单的代码就能描绘出专业美观的架构和设计图,充分体现了“码即是图,图亦是码”的理念。

码上悦读 3759

UML时序图简析[drawio]

定义:时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息对应一个类操作或状态机中引起转换的触发事件。上述定义来源于百度百科,从定义中可以看出,时序图就是用来描述系统内部多个对象之间交互过程的。

很多时候犯错都是在不知情的情况下发生的 8818

工程场景下的 diagram-design 实践:从信息分层到文本化图表治理

在软件研发与系统设计中,图表是团队对齐认知的关键载体,而不仅仅是“画图”。diagram-design 的核心在于信息架构设计,通过清晰的信息层级让读者快速理解系统主干与依赖关系。文本化图表方案(如 Mermaid、D2、Structurizr)将图表的源文件纳入版本控制,使图表与代码同源演进,解决了传统绘图工具难以维护和审查的痛点。从架构图到流程图,合理运用分层布局、颜色语义与图例说明,能显著提升技术文档的沟通效率。本文从工程实践出发,系统梳理了图表设计的核心原则、工具选型与踩坑记录,帮助读者构建可持续维

weixin_34060299的博客 458

UML建模之——时序图(待整理)

时序图作为常用的UML交互图,可以直观的传达系统内外之间的交互过程,经常用在详细设计文档中。下面本文综合参考了多篇时序图的教程,根据作者的思路将时序图做了更深入的讲解。 一、什么是时序图? 时序图(Sequence Diagram),亦称为序列图、循序图或顺序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。 时序图是一个二维图,横轴表示对...

weixin_30314813的博客 2349

单点登录系统Cas时序图.drawio

单点登录系统时序图

034、特定场景优化(一):小目标检测的改进策略合集

本文针对工业场景中的小目标检测难题,提出了一套实战优化方案。首先从数据层面建议保持高分辨率输入(1024-1280像素)或采用切块训练策略,并适当放大标注区域。在网络结构上,提出减少下采样次数、增加高分辨率检测头、引入空间注意力机制等改进。损失函数方面推荐使用NWD匹配和QFL损失提升小目标敏感度。部署环节强调NMS优化、分辨率对齐和量化处理技巧。最后总结核心经验:优先优化数据质量而非模型结构,标注一致性比算法更重要,同时需为实际部署预留性能余量。硬件升级有时比算法调优更经济有效。

xiaoyaohou11的博客 652

基于 Claude Project 指令生成 draw.io 图表:drawio-mcp 无 MCP 服务器方案实战指南

**本文导读**:drawio-mcp 仓库除了提供标准 MCP 服务器外,还内置了一条"零安装"替代路径——通过 `project-instructions/` 目录下的 Claude Project 指令,教会 Claude 用 Python 代码生成 draw.io 的 `#create=` 压缩链接,并以 HTML artifact 交付。本文将完整拆解这套指令的工作原理、安装步骤、Pyt

gitblog_01098的博客 337

Synares病毒实战:如何手动清除C盘隐藏的Synaptics.exe(附资源修复脚本)

本文详细介绍了Synares感染型病毒的手动清除方法,该病毒伪装成Synaptics触摸板驱动,感染EXE和XLSX文件。文章提供了从病毒行为分析、母体清除到被感染文件修复的全流程指南,并附有实用的资源修复脚本和防御加固方案,帮助用户彻底清除这一顽固病毒。

lg888的博客 2349

LaTeX原生绘制UML图:学术文档一致性与可维护性实践

UML图是软件工程与学术文档中表达系统结构和行为的核心可视化工具。其本质是建模语言与排版系统的深度协同——既要准确表达类、接口、时序等语义,又需严格服从文档字体、编号、引用等格式规范。传统截图导出方案常导致矢量失真、中文字体错乱、交叉引用失效等‘隐性技术债’;而LaTeX原生绘图(如tikz-uml)将UML元素转化为可编译的代码,实现文本级复用、引擎级兼容(XeLaTeX/LuaLaTeX)与学术出版级保真。尤其在研究生论文、IEEE/ACM期刊投稿、中文技术讲义等场景中,它直接解决‘图题编号错位’‘方法

weixin_33521678的博客 49

实验六 有源滤波器

实验六 有源滤波器一、实验目的二、仪器及设备三、预习要求画出三个电路的幅频特性曲线。四、实验内容l.低通滤波电路2.高通滤波电路3.带阻滤波电路(1)实测电路中心频率。(2)以实测中心频率为中心,测出电路幅频特性。五、实验报告六,仿真图:图 1 低通滤波器仿真图图 2 高通滤波器仿真图图 3 带阻滤波电路仿真图 一、实验目的 1.熟悉有源滤波电路构成及其特性。 2.学会测量有源滤波电路幅频特性。 二、仪器及设备 1.示波器 2.信号发生器 三、预习要求 1.预习教材有关滤波电路

胡毛毛的博客 1万+

科研党必备:5分钟搞定Arxiv论文批量导入NoteExpress(附PDF自动下载技巧)

本文为科研人员提供了一套高效的自动化工作流,实现从Arxiv批量检索论文、自动下载PDF到无缝导入NoteExpress的全过程。通过Python脚本和NASA ADS等工具,可大幅提升文献管理效率,特别适合需要追踪前沿动态的研究生和科研团队。

orange的博客 398

鱼皮 AI 知识库教程:程序员 1 分钟用 AI 生成架构图、流程图与 UML 的 5 类保姆级方法

本教程源自鱼皮 AI 知识库(ai-guide 开源仓库)中的《1 分钟生成架构图?程序员 AI 绘图保姆级教程》,系统讲解 AI 画图的本质与 **5 大类画图方法**(文本绘图、网页绘图、思维导图、专业绘图工具、Emoji 绘图)及 **4 个高级技巧**。读完本文,你将掌握用 Mermaid、PlantUML、SVG、Canvas、draw.io 等工具配合 Cursor + Claude

gitblog_00057的博客 296

MicroBlaze系列教程(5):AXI_UART16550的使用

axi-uart16550是Xilinx的一款串口IP核,支持配置成16450或16550模式,16550和16450是指的早期电脑主板上的串口芯片型号,16550相比于16450多了FIFO,现在已经很少使用。相比于,16550支持1或2位停止位,包括uartlite所有的功能,而且支持在SDK中灵活对波特率、数据、校验方式进行配置。与uartlite不同的是,不能单独指定发送中断和接收中断函数,只有一个中断函数,通过event参数来区分当前是发送或接收中断。

whik1194的博客 4543

draw.io XML 生成权威参考:drawio-mcp 中 mxGraph 模型、样式、容器与布局通道实战指南

本指南以 drawio-mcp 仓库的 [shared/xml-reference.md](https://link.gitcode.com/i/4d5c1e5b31347b4b9d47814721d53e88) 为骨架,系统讲解 Agent/LLM 生成 draw.io(.drawio)XML 时必须遵守的结构规则、样式语法、容器层级、图层/标签/元数据机制与两套可选的服务端布局通道(libav

gitblog_00834的博客 276

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5382

画图拖到崩溃?PlantUML 用代码画架构图,可以Git 还能 diff

PlantUML 是一款开源文本绘图工具。用纯文本写图代码,工具自动渲染成图形。不用拖拽画布,只用专注描述逻辑。它支持几乎所有主流图表类型。它兼容 Windows、Mac、Linux。它能集成到 VSCode、IDEA、GitLab、Markdown、Notion 等开发工具里。代码即图表、版本友好、轻量化、一键生成、跨平台。

weixin_46158019的博客 671

Dify 第 2 篇 Dify 插件离线安装

Dify是一个支持插件扩展的AI平台,其插件市场提供5种类型插件(模型、工具、Agent策略、扩展、插件包)。由于默认pip安装速度慢,可通过dify-plugin-repackaging工具将插件转换为离线包(使用阿里云镜像加速)。该工具提供两种方式:1)自备Python环境执行脚本;2)使用Docker环境(推荐)。脚本支持从Dify市场或GitHub下载插件,并重新打包为含依赖的离线包,便于通过"本地插件"方式快速安装。

甘蓝的专栏 1264

drawio-mcp 的 Codex drawio 技能全解:用 Mermaid 或 XML 生成原生 .drawio 图表、ELK 自动布局与多格式导出

> 本文是 drawio-mcp 仓库中 [Codex 插件的 drawio 技能](https://link.gitcode.com/i/78d91a4db41f2c558f1299e64afe3c96)(SKILL.md)的完整技术指南。它详细拆解了让 Codex 在本地生成原生 `.drawio` 图表的全部机制:如何选择 Mermaid 或 draw.io XML 两种创作路径、如何用桌面

gitblog_01177的博客 149

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

StarUML官方安装与工程化建模全指南:UML 2.5+DDD实战

UML(统一建模语言)是软件工程中用于可视化、构造和文档化系统结构与行为的基础建模标准;其核心原理在于通过类图、时序图、组合关系等图形化元素,精准表达对象间语义约束与生命周期依赖。StarUML作为深度支持UML 2.5规范的开源建模工具,凭借模型即代码、双向工程同步、强语义校验等技术价值,已成为DDD领域驱动设计、微服务架构治理与Clean Architecture落地的关键基础设施。它广泛应用于高校课程设计、企业级系统建模、API契约生成及团队协作文档化等场景,尤其在实体类图标、单向导航组合、服务订阅交

aiqixiao2017的博客 556

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

开发小记 - 常用设置

开发中一些常用的设置

Sun 900

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于HTML5 Canvas与JSON配置的轻量级技术图表工具开发实践

在技术文档与工程实践中,图表可视化是传达复杂系统架构与流程的关键手段。其核心原理在于将抽象逻辑转化为直观的图形元素,通过数据驱动的方式动态生成。掌握高效的可视化工具能显著提升技术文档的质量与协作效率,尤其适用于软件架构设计、API接口说明与项目流程梳理等场景。本文聚焦于利用HTML5 Canvas的像素级绘图能力与JSON的轻量结构化数据,实现一个配置化、可编程的图表生成引擎。该方案通过预定义图形元素与样式配置,将绘图过程简化为数据描述,并支持一键导出高清图片,有效解决了技术写作中配图耗时、风格不统一的痛点

weixin_30745553的博客 736

AI Agent 智能体脚手架 + 场景应用:基于 Spring AI、LangChain4j 与 Google ADK 的企业级智能体架构实战

> 本文是一份面向 Java 工程师的 AI Agent 智能体开发实战指南。它以小傅哥开源的 **CodeGuide** 仓库中《AI Agent 脚手架 + 场景应用》系列文档为骨架,系统讲解如何综合 Spring AI、LangChain4j 与 Google ADK(A2A、MCP、Skills)构建一套可复用的通用智能体脚手架底座,并借助该底座落地"AI + Draw.io 交互式绘图"

gitblog_01032的博客 250

技术文档图片转可编辑PPT:矢量保真与语义分层实战指南

在技术文档工作流中,‘图片转可编辑PPT’已超越格式转换范畴,成为保障视觉资产可维护性、可追溯性与版本可控性的关键环节。其核心依赖于矢量保真度(如SVG路径还原能力)与语义分层能力(自动识别标题/图表/公式并分配独立图层),二者共同支撑LaTeX公式双击编辑、API参数表单元格直改、时序图连线关系保持等硬性工程需求。该能力广泛应用于芯片设计汇报、算法流程复盘、实验室安全培训等高精度场景,尤其适配含多级缩进、跨模态混排(代码+公式+图表)的技术截图。本文聚焦真实技术文档的解析鲁棒性,不谈AI生成,只验‘抢救式

weixin_34185320的博客 267

D2文本架构图:让系统拓扑成为可编程、可版本化、可测试的代码资产

架构图本质上是系统结构的可视化表达,其核心价值在于准确传递依赖关系、边界划分与数据流向。传统工具如Visio依赖图形操作,导致图与代码脱节、协作低效、版本混乱;而现代云原生环境要求架构描述具备可编程性、可追溯性和自动化集成能力。D2作为专为架构设计的轻量级文本DSL,以冒号定义语义关系、缩进表达逻辑层级,将架构降维为纯文本文件,天然支持Git版本管理、CI/CD自动编译与diff评审。它不止解决‘怎么画图’,更推动架构从静态文档升级为可执行、可验证、可演进的工程资产——尤其适用于微服务治理、SRE协同与De

weixin_34293911的博客 348

Mermaid Live Editor实战:用代码画流程图、ER图与文档协作指南

在文档和知识管理场景中,图表绘制常常是协作效率的瓶颈。传统拖拽式工具不仅安装成本高,还难以进行版本对比和全文检索。以纯文本描述图表的标记语言——Mermaid,为这一难题提供了新思路:通过简洁语法定义节点与连线,即可自动渲染出流程图、时序图、类图、ER图等多种图表,并天然支持Git版本管理与多人协作。Mermaid Live Editor作为官方在线编辑器,无需安装注册,即可实时预览并导出SVG/PNG,配合Typora、GitHub等生态实现“代码即图”的流畅工作流。本文从界面操作、核心语法到学校教学管理

weixin_34121282的博客 894
上一篇: Java方法完整调用链生成工具
下一篇: Java类初始化失败后出现NoClassDefFoundError分析
adrninistrat0r
博客等级 码龄18年 395粉丝 136原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值