> **English** — Design notes for DiagramKit: positioning, data model, tool interface, report format, algorithms, and phasing. Written in Chinese.\n\n# 鍥捐〃鎻掍欢璁捐璇存槑 > 浠e彿 DiagramKit銆傜洰鏍囪鑰咃細瑕佸疄鐜板畠鐨勫紑鍙戣€呫€?> 鑳屾櫙锛氭湰鏂囨。鏉ヨ嚜涓€娆$湡瀹炰换鍔♀€斺€旂敤 Word 浜や粯 9 寮犺蒋浠跺伐绋嬪浘锛圢-S 鍥俱€丳AD 鍥俱€佸垽瀹氭爲銆丒-R 鍥俱€?> 鍒嗗眰鏁版嵁娴佸浘銆佺敤渚嬪浘锛夛紝杩囩▼涓弽澶嶅嚭鐜?鐚滃瓧瀹界寽閿?鈫?娓叉煋 鈫?鐪嬪浘 鈫?鏀?鐨勫線杩斻€傝璁$洰鏍囨槸 > 鎶婅繖绫诲線杩斿帇鎺変竴鍗婁互涓娿€? --- ## 0. 涓€鍙ヨ瘽瀹氫綅 **瀹冧笉鏄敾鍥惧伐鍏凤紝鏄帓鐗堥噺灏?+ 鑷鍣ㄣ€?* 瀹冧笉璐熻矗"鐞嗚В浣犺鐢讳粈涔?锛堥偅鏄?LLM 鐨勪簨锛夛紝涔熶笉璐熻矗"鏇夸綘鍐冲畾鎬庝箞鎽?锛堥偅鏄绉戣姹傦級銆?瀹冨彧璐熻矗涓や欢浜嬶細 1. **绮剧‘娴嬮噺**鈥斺€旇繖娈垫枃瀛楀湪 8pt 涓嬪埌搴曞崰澶氬锛?2. **绮剧‘楠岃瘉**鈥斺€旀垜鎵嬪伐鎽嗙殑杩欎釜甯冨眬锛屽摢閲屾孩鍑轰簡銆佸摢閲屽帇绾夸簡銆佸摢閲岀┛妗嗕簡锛? 鑷姩鎺掔増鏄彲閫夐檮鍔犻」锛屼笉鏄牳蹇冦€? --- ## 1. 璁捐鍘熷垯 | # | 鍘熷垯 | 鐞嗙敱 | |---|---|---| | 1 | **鎵嬪伐鍧愭爣鏄竴绛夊叕姘?* | N-S 鍥剧殑閫掑綊鍒掑垎銆丳AD 鍥剧殑宸︿晶涓荤嚎锛岄兘鏄绉戣瀹氱殑甯冨眬锛岀畻娉曚笉鑳芥浛 | | 2 | **涓€鍒囦互鍘樼背涓哄崟浣?* | 鏈€缁堣钀藉埌 Word 鐨?cm 灏哄涓婏紝涓棿涓嶈寮曞叆 px / pt / inch 鎹㈢畻 | | 3 | **姣忔璋冪敤閮借繑鍥?鍥?+ 缁撴瀯鍖栨姤鍛?** | 鏈変簡鎶ュ憡锛屽鏁拌疆娆℃垜鏍规湰涓嶇敤鐪嬪浘 | | 4 | **浼氳瘽寮忥紝涓嶆槸鏃犵姸鎬?* | 鏀逛竴鏉$嚎涓嶈閲嶈窇鏁翠釜鑴氭湰 | | 5 | **涓嶇璇箟** | 涓嶈В鏋愯嚜鐒惰瑷€锛屼笉鐭ラ亾"杩欐槸绗嚑灞傛暟鎹祦鍥? | --- ## 2. 鏁版嵁妯″瀷 ### 2.1 鐢诲竷 ```json { "canvas": { "w_cm": 15.5, "h_cm": 8.3, "auto_height": true, "margin_cm": 0.2, "bg": "white" } } ``` `h_cm` 鐪佺暐鎴?`auto_height: true` 鏃讹紝鎸夊唴瀹瑰寘鍥寸洅鑷姩绠楅珮銆? ### 2.2 鑺傜偣 ```json { "id": "p1", "shape": "round_rect", "text": "鍊熶功澶勭悊", "num": "1", "at": [5.2, 3.2], "size": [3.0, 1.1], "min_size": [1.2, 0.8], "padding_cm": 0.18, "font_pt": 8, "text_align": "center", "text_valign": "center", "group": "g1", "z": 0, "locked": false } ``` | 瀛楁 | 蹇呭~ | 璇存槑 | |---|---|---| | `id` | 鏄?| 鍏ㄥ浘鍞竴 | | `shape` | 鏄?| 瑙?搂2.5 | | `text` | 鍚?| 涓绘枃瀛楋紝`\n` 寮哄埗鎹㈣ | | `num` | 鍚?| 缂栧彿銆侱FD 鍔犲伐鍐欏湪妗嗗唴涓婃柟锛屾暟鎹瓨鍌ㄥ啓鍦ㄥ乏绔己鍙e | | `at` | 鍚?| **涓績鐐?* cm銆傜渷鐣?浜ょ粰鑷姩甯冨眬锛涚粰浜?缁濆瀹氫綅锛屽伐鍏蜂笉寰楁搮鑷惉鍔?| | `size` | 鍚?| `[瀹? 楂榏` cm銆傜渷鐣?鎸夋枃瀛?+ padding 鑷姩 | | `min_size` | 鍚?| 鑷姩灏哄鐨勪笅闄?| | `padding_cm` | 鍚?| 鏂囧瓧涓庤竟妗嗙殑闂磋窛锛岄粯璁?0.18 | | `group` | 鍚?| 鎵€灞炲鍣?id | ### 2.3 杈? ```json { "id": "e1", "from": "p1", "to": "p2", "from_point": null, "to_point": null, "from_side": "auto", "to_side": "auto", "arrow": "open", "dash": false, "label": "鍊熶功璇?, "label_at": "auto", "label_offset_cm": 0.2, "route": "orthogonal", "waypoints": [[8.8, 1.8], [8.8, 4.45]], "priority": 0 } ``` | 瀛楁 | 璇存槑 | |---|---| | `from` / `to` | 鑺傜偣 id锛涗篃鍙敤 `from_point: [x,y]` 鎺ヨ8鍧愭爣 | | `from_side` / `to_side` | `auto` \| `top` \| `bottom` \| `left` \| `right` \| 瑙掑害鍊硷紙妞渾鐢級 | | `arrow` | `none`锛堝叧鑱旂嚎锛塡| `open`锛堟暟鎹祦锛塡| `filled` \| `both`锛堝弻鍚戣鍐欙級 | | `dash` | 铏氱嚎锛孶ML 渚濊禆鐢?| | `label_at` | `auto` \| `above` \| `below` \| `left` \| `right` \| `[x,y]` | | `waypoints` | **缁欎簡灏卞畬鍏ㄤ笉璺敱**锛屾寜鎶樼嚎鐢汇€傛墜宸ユ帶鍒惰蛋绾跨殑鍞竴鍑哄彛 | | `route` | `orthogonal` \| `straight` \| `auto` | | `priority` | 璺敱鍐茬獊鏃惰皝璁╄矾锛屾暟鍊煎皬鐨勪紭鍏堣蛋鐩寸嚎 | ### 2.4 瀹瑰櫒 / 鍒嗙粍 ```json { "id": "g1", "shape": "rect", "text": "鍥句功绠$悊绯荤粺鐧诲綍妯″潡", "label_pos": "top_left", "at": [7.8, 6.4], "size": [10.4, 6.0], "children": ["uc1", "uc2"], "child_coords": "absolute" } ``` - `child_coords: absolute`锛氬瓙鑺傜偣 `at` 鏄粷瀵瑰潗鏍囷紝瀹瑰櫒**鍙牎楠屼笉鎼姩**锛堥粯璁わ紝瀹夊叏锛?- `child_coords: relative`锛氬瓙鑺傜偣 `at` 鏄浉瀵瑰鍣ㄥ乏涓婅鐨勫亸绉伙紝瀹瑰櫒绉诲姩鏃跺瓙鑺傜偣璺熼殢 鐢ㄩ€旓細UML 绯荤粺杈圭晫妗嗐€丯-S 鍥剧殑鍒嗗尯銆佹吵閬撱€? ### 2.5 鍥惧厓琛? | shape | 鐢绘硶 | 鍏稿瀷鐢ㄩ€?| |---|---|---| | `rect` | 鐩磋鐭╁舰 | 澶栭儴瀹炰綋銆丒-R 瀹炰綋銆丳AD 澶勭悊妗?| | `round_rect` | 鍦嗚鐭╁舰锛堝崐寰?0.25cm锛?| DFD 鍔犲伐 | | `store` | 寮€鍙g煩褰細涓婅竟銆佷笅杈广€佸彸绔皝鍙o紝**宸︾鐣欑己鍙?*锛岀紪鍙峰啓鍦ㄧ己鍙e渚?| 鏁版嵁瀛樺偍 | | `ellipse` | 妞渾 | UML 鐢ㄤ緥銆丒-R 灞炴€?| | `diamond` | 鑿卞舰 | E-R 鑱旂郴 | | `actor` | 鐏煷浜猴細澶达紙鍦嗭級+ 韬?+ 鑷?+ 涓よ吙锛屽浐瀹氭瘮渚嬶紝鍚嶅瓧鍦ㄤ笅鏂?| UML 鍙備笌鑰?| | `box_span` | **鏃犺竟妗?*鐭╁舰锛屽彧鍗犱綅銆佸彧娴嬫枃瀛?| N-S 鍥剧殑鏉′欢甯︺€乀/F 鏍囪甯?| | `line_h` | 鍗曟牴姘村钩绾挎锛坄at` 鏄捣鐐癸紝`size[0]` 鏄暱搴︼級 | N-S 鍥剧殑鍒嗗尯绾?| | `line_v` | 鍗曟牴绔栫洿绾挎 | PAD 鍥剧殑涓荤嚎 | | `chevron` | 鍒嗘敮绗?`<`锛歚(x,y1) 鈫?(x-d, mid) 鈫?(x,y2)` | PAD 鍥剧殑鏉′欢鍒嗘敮 | > `box_span`銆乣line_h`銆乣line_v`銆乣chevron` 鏄?*涓撲负 N-S 鍥惧拰 PAD 鍥惧姞鐨?*銆?> 杩欎袱绉嶅浘鏈川涓婁笉鏄?妗?+ 绠ご"锛岃€屾槸"涓€鍧楀尯鍩熻鍙嶅鍒囧垎"銆傚皯浜嗚繖鍥涗釜鍥惧厓锛?> 灏卞彧鑳介€€鍥炲啓浠g爜鈥斺€旈偅灏卞け鍘绘剰涔変簡銆? ### 2.6 鏍峰紡 ```json { "style": { "cn_font": "C:/Windows/Fonts/simhei.ttf", "en_font": "C:/Windows/Fonts/times.ttf", "font_pt": 8, "label_pt": 7, "line_w_pt": 1.2, "color": "#000000", "preset": "se-textbook" } } ``` **瀛椾綋蹇呴』璧扮湡瀹炴枃浠惰矾寰勶紝涓嶈兘鐢ㄥ瓧浣撳悕銆?* SimHei 缂?`芦` `禄` `鈥擿 杩欑被瀛楀舰锛?宸ュ叿瑕佸湪**娴嬮噺闃舵**灏辨姤 `glyph_missing`锛岃€屼笉鏄覆鏌撳嚭涓€鍫嗘柟妗嗚鎴戜簨鍚庡彂鐜般€? 鍐呯疆棰勮锛? | preset | 鍐呭 | |---|---| | `se-textbook` | 榛戜綋 8pt / 鏍囨敞 7pt / 绾垮 1.2pt / 鐧藉簳榛戠嚎銆傛湰娆″叏閮ㄥ浘鐢ㄧ殑灏辨槸瀹?| | `uml` | 鍚屼笂锛屼絾鐢ㄤ緥瀛楀彿 8.5pt銆佸弬涓庤€呭悕瀛?7.5pt | | `dfd` | 鍔犲伐鍦嗚 0.25cm銆佸瓨鍌ㄧ己鍙?0.55cm | --- ## 3. 宸ュ叿鎺ュ彛 ### 3.1 `diagram_create(spec) -> {id, image, report}` ### 3.2 `diagram_patch(id, ops) -> {image, report}` 澧為噺鎿嶄綔锛屼笉閲嶅彂鏁翠釜 spec锛? ```json [ {"op": "move", "node": "a2", "to": [2.5, 5.85]}, {"op": "resize", "node": "uc2", "size": [5.8, 1.8]}, {"op": "set", "edge": "e3", "label": "璇?/ 鍐欏€熶功鏂囦欢"}, {"op": "add", "node": {"id": "a5", "shape": "actor", "text": "鏂板弬涓庤€?, "at": [2.5, 8.0]}}, {"op": "remove", "edge": "e9"}, {"op": "style", "font_pt": 7.5} ] ``` ### 3.3 `diagram_measure(id, items) -> {boxes}` **鍙祴閲忥紝涓嶆覆鏌撱€?* 鏈€渚垮疁鐨勪竴妗b€斺€旀垜鎯崇煡閬?杩欒瀛楁斁杩?3.0cm 鐨勬浼氫笉浼氭孩鍑?鏃讹紝 涓嶈浠樹竴娆℃覆鏌撶殑浠d环銆? ### 3.4 `diagram_render(id, {dpi, max_w_cm}) -> image` ### 3.5 `diagram_export(id, {format: "png"|"svg"|"pdf", path})` ### 3.6 `docx_insert(docx_path, id, {caption, max_w_cm, keep_with_next}) -> {placed_w_cm}` 鎻掑浘 + 灞呬腑 + 鍥鹃 + 涓庝笅娈靛悓椤碉紝涓€娆¤皟鐢ㄣ€?鐜板湪杩欐鏄嚑鍗佽 python-docx 鑳舵按锛屾瘡娆¢兘瑕侀噸鍐欍€? --- ## 4. 鎶ュ憡鏍煎紡锛堟牳蹇冿級 ```json { "ok": false, "canvas_used_cm": [15.6, 8.3], "issues": [], "geometry": { "uc1": [5.30, 2.45, 10.30, 4.25], "a1": [2.31, 1.13, 2.69, 2.35] }, "text_boxes": { "uc1": [[0, 6.05, 3.20, 7.35, 3.50]] }, "stats": { "nodes": 6, "edges": 4, "crossings": 0, "max_text_overflow_cm": 0.0, "max_label_overlap_cm2": 0.0 } } ``` `text_boxes` 閲屾瘡琛屾槸 `[琛屽彿, x0, y0, x1, y1]`鈥斺€旀垜鎯崇簿纭煡閬撴煇涓€琛屾枃瀛楄惤鍦ㄥ摢銆? ### issue 绫诲瀷琛? | type | 瀛楁 | 绾у埆 | 寤鸿淇硶锛堝伐鍏峰繀椤荤粰鍑猴級 | |---|---|---|---| | `text_overflow` | node, text_w, box_w, over_cm | error | 妗嗗姞瀹藉埌 X.Xcm锛屾垨瀛楀彿闄嶅埌 Y.Ypt | | `text_clipped` | node, line, over_cm | error | 鍚屼笂 | | `node_overlap` | a, b, overlap_cm2 | error | 寤鸿浣嶇Щ鍚戦噺 `[dx, dy]` | | `edge_through_node` | edge, node | error | 鏀硅蛋绾匡紝鎴栨尓鑺傜偣 | | `outside_canvas` | node, over_cm, side | error | 鐢诲竷鏀惧ぇ鍒?W脳H | | `glyph_missing` | font, char, node | error | 鎹㈠瓧浣擄紝鎴栨浛鎹㈣瀛楃 | | `edge_cross` | e1, e2, at | info | 浜ゅ弶鏁帮紱涓嶄竴瀹氭敼 | | `label_collision` | a, b, overlap_cm2 | warn | 鏍囩鎸綅寤鸿 | | `label_on_edge` | label, edge | warn | 鏍囩鍋忕Щ寤鸿 | | `near_miss` | a, b, gap_cm | warn | 闂磋窛杩囧皬锛? 0.15cm锛?| | `dfd_unbalanced` | parent, child, flow | info | 浠?DFD锛氱埗瀛愭暟鎹祦涓嶄竴鑷?| 绾у埆璇箟锛?- `error` 鈥斺€?涓€瀹氶毦鐪?/ 涓€瀹氶敊锛屽繀椤绘敼 - `warn` 鈥斺€?鑳界湅锛屼絾浼氳鎵e垎 - `info` 鈥斺€?渚涘弬鑰? **姣忔潯 issue 蹇呴』甯﹀彲鎵ц鐨勪慨娉曘€?* "鏂囧瓧姣旀瀹?0.14cm" 姣?"甯冨眬鏈夌偣鎸? 鏈夌敤涓€鐧惧€嶁€斺€斿墠鑰呮垜鐩存帴鏀规暟瀛楋紝鍚庤€呮垜杩樺緱鑷繁鎵俱€? --- ## 5. 鍐呴儴绠楁硶 ### 5.1 鏂囧瓧娴嬮噺锛堝湴鍩猴紝鍏堝仛杩欎釜锛? - 鐢?`fontTools` 璇诲瓧浣撴枃浠剁殑鐪熷疄搴﹂噺 - 蹇呴』鐪熸煡瀛椾綋琛紝浣?*鐞嗙敱鍜屽師鏉ュ啓鐨勪笉涓€鏍?*銆傚疄鐜板悗瀹炴祴锛坄test/verify.mjs`锛夛細 SimHei 鏄?*涓ユ牸涓ゅ搴?*瀛椾綋鈥斺€擟JK 涓庡叏瑙掓爣鐐规亽涓?1.000 em锛孉SCII 鎭掍负 0.500 em銆? 鎵€浠ュ SimHei 鑰岃█"ASCII 鎸?0.5 em 浼?鏄?*绮剧‘鐨?*锛屽師鏉ラ偅鍙?浼氫及閿?15%"鏄敊鐨勩€? 鐪熸鐨勫潙鍦?*鍒嗙被**锛歚鈥溾€濓紙锛夈€娿€嬶紝銆傘€乣 杩欎簺鐪嬬潃"灏?鐨勭鍙峰湪 SimHei 閲屾槸鍏ㄨ 1 em銆? 鎶?`杈撳嚭鈥滅瓑杈逛笁瑙掑舰鈥漙 閲岀殑寮紩鍙峰綋鍗婅浼帮紝浼氬皯绠?**0.56cm锛?2%锛?*鈥斺€旇繖鎵嶆槸褰撳勾杩斿伐鐨勭湡姝e師鍥犮€? 鎹㈠瓧浣撳悗 0.5 em 鐩存帴澶辨晥锛歍imes New Roman 鐨?`A`=0.722em銆乣i`=0.278em銆乣W`=0.944em銆? 缁撹锛?*瑕佷箞鐪熸煡琛紝瑕佷箞蹇呴』缁存姢涓€寮犳纭殑瀛楃鍒嗙被琛紱闈犵溂鐪嬪瓧褰㈢寽瀹藉害蹇呴敊銆?* - 杈撳嚭姣忚鐨?`(w, h)`锛屼箻瀛楀彿寰?cm - 鎹㈣锛歚\n` 寮哄埗鏂紱瓒呰繃 `max_width_cm` 鑷姩鏂紙涓枃鎸夊瓧鏂紝鑻辨枃鎸夎瘝鏂級 - 椤哄甫鍋氬瓧褰㈣鐩栨鏌ワ紝缂哄瓧绔嬪埢鎶? ### 5.2 鑷姩灏哄 `size` 鐪佺暐鏃讹細 ``` w = max(姣忚瀹藉害) + 2 * padding h = 琛屾暟 * 琛岄珮 + 2 * padding 鍐嶅彇 min_size 涓嬮檺 ``` ### 5.3 鑷姩閿氱偣 缁欏畾涓ゆ锛屾灇涓惧洓鏉¤竟 脳 鍥涙潯杈圭殑缁勫悎锛屽彇"绾挎鏈€鐭笖涓嶇┛绗笁涓"鐨勪竴瀵广€?妞渾鎸夊弬鏁版柟绋嬬畻杈圭晫鐐癸紙`x = cx + a路cos胃`, `y = cy + b路sin胃`锛屾敞鎰?y 杞村悜涓嬫椂 "涓婃柟"瀵瑰簲 sin胃 < 0鈥斺€旇繖娆℃垜灏辨牻鍦ㄨ繖涓鍙蜂笂锛夈€? ### 5.4 姝d氦璺敱 鏍呮牸鍖?+ A*锛屼唬浠峰嚱鏁帮細 ``` cost = 璺緞闀垮害 + 杞集鏁?脳 0.3cm + 绌挎 脳 鈭? + 涓庡凡鏈夎竟閲嶅彔闀垮害 脳 2 ``` `waypoints` 缁欎簡灏辨暣娈佃烦杩囪矾鐢便€? ### 5.5 纰版挒妫€娴? 鍏ㄩ儴閫€鍖栨垚**鐭╁舰鐩镐氦娴嬭瘯**锛堟枃瀛楀寘鍥寸洅銆佽妭鐐瑰妗嗐€佺嚎娈靛寘鍥寸洅锛夈€?绠€鍗曘€佸揩銆佸鐢ㄣ€備笉闇€瑕佺湡鐨勫仛鍑犱綍姹備氦銆? ### 5.6 鑷姩甯冨眬锛堝彲閫夛紝榛樿鍏筹級 | 甯冨眬 | 鐢ㄤ簬 | |---|---| | `tree` | 鍒ゅ畾鏍?| | `layered` | DFD 鍒嗗眰锛圫ugiyama锛?| | `grid` | E-R 灞炴€х幆缁曞疄浣?| 鎺掑畬浠嶈璺戜竴閬嶈嚜妫€銆?*鑷姩甯冨眬涓嶄繚璇佷笉鍑洪敊锛屽彧淇濊瘉璧风偣涓嶉毦鐪嬨€?* --- ## 6. 瀹屾暣渚嬪瓙锛氱 6 棰樼敤渚嬪浘 ### 杈撳叆 spec ```json { "canvas": {"w_cm": 15.6, "h_cm": 8.3}, "style": {"preset": "uml"}, "nodes": [ {"id": "uc1", "shape": "ellipse", "text": "楠岃瘉鐢ㄦ埛韬唤", "at": [7.8, 3.35], "size": [5.0, 1.8]}, {"id": "uc2", "shape": "ellipse", "text": "杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜", "at": [7.8, 6.95], "size": [5.8, 1.8]}, {"id": "a1", "shape": "actor", "text": "鍥句功鍊熼槄鍛?, "at": [2.50, 1.55]}, {"id": "a2", "shape": "actor", "text": "鍥句功绠$悊鍛?, "at": [2.50, 5.85]}, {"id": "a3", "shape": "actor", "text": "绯荤粺绠$悊鍛?, "at": [13.10, 1.55]}, {"id": "a4", "shape": "actor", "text": "鍥句功鍊熼槄鑰?, "at": [13.10, 5.85]} ], "edges": [ {"from": "a1", "to": "uc1", "arrow": "none"}, {"from": "a2", "to": "uc1", "arrow": "none"}, {"from": "a3", "to": "uc1", "arrow": "none"}, {"from": "a4", "to": "uc1", "arrow": "none"}, {"from": "uc1", "to": "uc2", "arrow": "open", "dash": true, "label": "<>", "label_at": "right"} ] } ``` ### 杩斿洖鐨勬姤鍛婏紙鍋ュ悍鐨勬儏鍐碉級 ```json { "ok": true, "canvas_used_cm": [15.6, 8.3], "issues": [], "stats": {"nodes": 6, "edges": 5, "crossings": 0} } ``` ### 濡傛灉鎴戞妸 a1 鎸埌 [7.8, 1.0]锛堟晠鎰忓帇鍒?uc1 涓婏級 ```json { "ok": false, "issues": [ {"type": "node_overlap", "a": "a1", "b": "uc1", "overlap_cm2": 0.42, "suggest": [0.0, -1.6]}, {"type": "label_collision", "a": "a1.name", "b": "uc1.text", "overlap_cm2": 0.11, "suggest": "鎶?a1 涓婄Щ鍒?y=0.9 鎴栧乏绉诲埌 x=2.5"} ], "stats": {"nodes": 6, "edges": 5, "crossings": 0} } ``` **杩欎竴鏉″氨鏄叏閮ㄤ环鍊兼墍鍦?*锛氭垜涓嶉渶瑕佺湅鍥撅紝鐓х潃 `suggest` 鏀瑰潗鏍囧氨琛屻€? --- ## 7. 瀹炵幇寤鸿 **鎶€鏈爤** - Python 3 + `matplotlib`锛圓gg 鍚庣锛? `fontTools` - 璺敱鍜屽竷灞€鑷繁鍐欙紝鍒紩澶т緷璧栵紙graphviz 杈撳嚭鐨勯鏍煎拰璇炬湰宸お杩滐級 - 涓嶈鐢?LibreOffice 閭e娓叉煋閾捐矾鈥斺€旇繖娆¤俯鍒扮殑鍧戯紙姣忛〉鍙粰宸︿笂瑙?80%锛? 璇存槑瀹冧笉閫傚悎褰撴祴閲忓熀鍑? **瑙勬ā浼拌** | 妯″潡 | 琛屾暟 | |---|---| | 鏂囧瓧娴嬮噺 + 纰版挒妫€娴?| ~200 | | 鍥惧厓缁樺埗锛埪?.5 鍏ㄩ儴锛?| ~400 | | 姝d氦璺敱 + 鏍囩钀戒綅 | ~200 | | 鑷姩甯冨眬锛埪?.6锛?| ~300 | | 宸ュ叿鎺ュ彛灞?+ 浼氳瘽鐘舵€?| ~200 | | **鏈€灏忓彲鐢ㄧ増**锛堟祴閲?+ 鑷 + `rect`/`ellipse`/`actor`/`line`锛?| **~400** | **鎺ヨ繘 DSH** - 涓€涓?tool 澹版槑 + 涓€涓父椹昏繘绋嬶紙淇濈暀 `id 鈫?鍥剧姸鎬乣锛夛紝鍒瘡娆″喎鍚姩 - 鍥剧墖璧板唴鑱旇繑鍥烇紝鍒彧缁欒矾寰勨€斺€旂渷鎺?鍐欐枃浠?+ 鍐嶈鍥炴潵"閭d竴瓒? --- ## 8. 鍒嗘湡 | 鐗堟湰 | 鍐呭 | 棰勪及 | |---|---|---| | **v0** | 娴嬮噺 + 鑷 + `rect`/`ellipse`/`actor`/`line` + `create`/`patch`銆?*涓嶅仛甯冨眬銆佷笉鍋氳矾鐢?* | 鍗婂ぉ | | v1 | 姝d氦璺敱 + 鏍囩鑷姩钀戒綅 + `store`/`round_rect`/`diamond`/`box_span`/`chevron` | 1鈥? 澶?| | v2 | 鑷姩甯冨眬 + `docx_insert` + SVG 瀵煎嚭 | 2鈥? 澶?| | 涓嶅仛 | 鑷劧璇█杈撳叆銆佷换鎰忔洸绾裤€佷笁缁淬€佸姩鐢汇€佸浜哄崗浣?| 鈥?| **濡傛灉鍙兘鍋氫竴浠朵簨锛氬仛 v0 閲岀殑"鏂囧瓧娴嬮噺 + 纰版挒鎶ュ憡"锛屼笉瑕佸竷灞€寮曟搸銆?* 杩欐涔濆紶鍥句笁鍗佸杞線杩旓紝缁濆ぇ澶氭暟鑺卞湪"鎴戠寽杩欒瀛楁斁寰椾笅锛屾覆鏌撳嚭鏉ュ彂鐜版斁涓嶄笅"銆?鎶婅繖涓€浠朵簨瑙e喅鎺夛紝鏀剁泭灏辫繃鍗婁簡銆?