13 Commits

Author SHA1 Message Date
PotatoMaxwell 1c21ef080e Merge pull request 'Merge pull request 'requriesments of .yml for bridge written' (#2) from qinyue_main into develope' (#7) from qinyue_main into develope
Reviewed-on: #7
2026-06-04 12:02:34 +00:00
= 1b7357e419 redundent files deleted 2026-06-04 20:01:32 +08:00
= b67c647995 Merged from jingwen_main for image icon revision 2026-06-04 20:00:13 +08:00
xsxx03-art 866bc1de18 update canvas.html 2026-06-04 19:32:28 +08:00
xsxx03-art 23d631c4f0 __pycache__ 2026-06-04 17:22:30 +08:00
xsxx03-art af5134dcee delete backend/__pycache__ 2026-06-04 17:14:33 +08:00
xsxx03-art feed2e0576 add gitignore 2026-06-04 17:12:23 +08:00
xsxx03-art 960066735c update 2026-06-04 15:17:02 +08:00
xsxx03-art 9b4f43f0b1 update 2026-06-03 10:06:48 +08:00
PotatoMaxwell 587f0532ab Merge pull request 'updated with github' (#5) from qinyue_main into develope
Reviewed-on: #5
2026-06-01 05:21:22 +00:00
PotatoMaxwell cf28676756 Merge pull request 'requriesments of .yml for bridge written' (#4) from develope into main
Reviewed-on: #4
2026-05-17 13:26:26 +00:00
PotatoMaxwell 09cadc7430 Merge pull request 'Icons updated' (#3) from qinyue_main into develope
Reviewed-on: #3
2026-05-17 13:25:35 +00:00
PotatoMaxwell 13d42af90d Merge pull request 'requriesments of .yml for bridge written' (#2) from qinyue_main into develope
Reviewed-on: #2
2026-05-17 02:33:39 +00:00
27 changed files with 631 additions and 98 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,100 @@
# =============================================
# mxPIC Cell/Project Definition File
# =============================================
schema_version: "2.0.0"
kind: cell
coordinate_system: gds_y_up
canvas_size:
width: 5000
height: 5000
project: mxpic_project_1
name: canvas_1
type: composite
version: "1.0.0"
# 1. External Ports (How this cell connects to the outside world)
pins:
- name: port_io1
layer: WG_CORE
element: port
pin: io1
x: 50.0
y: -150.0
angle: 180.0
width: 0.5
# 2. Instances (The sub-components dropped onto this canvas)
instances:
waveguide_1:
component: waveguide
x: 686.5
y: -1027.9
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length: 100
width: 0.5
xsection: "strip"
circle_1:
component: circle
x: 877.2
y: -1093.7
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
radius: 10
width: 0.5
xsection: "strip"
waveguide_2:
component: waveguide
x: 858.0
y: -1029.6
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length: 100
width: 0.5
xsection: "strip"
elements:
port:
type: port
x: 50.0
y: -150.0
angle: 0.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 0.5
description: ""
pins:
- name: port_io1
role: io1
# 3. Bundles (Grouped links for multi-bus/parallel routing)
bundles:
output_bus:
routing_type: euler_bend
links:
- from: waveguide_1:b1
to: waveguide_2:a1
xsection: strip
family: optical
width: 0.5
radius: 10
routing_type: euler_bend
- from: waveguide_2:b1
to: circle_1:a1
xsection: strip
family: optical
width: 0.5
radius: 10
routing_type: euler_bend
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="6516.95" height="2377.45" viewBox="14124.775 14328.775 6516.95 2377.45">
<defs>
<style type="text/css">
.l1111d0 {stroke: #B3446C; fill: #B3446C; fill-opacity: 0.5;}
</style>
</defs>
<rect x="14124.775" y="14328.775" width="6516.95" height="2377.45" fill="#222222" stroke="none"/>
<g id="canvas_2" transform="scale(1 -1)">
<polygon id="00000215A6721690" class="l1111d0" points="20243,-14702.5 14421,-14702.5 14421,-14697.5 20243,-14697.5"/>
<polygon id="00000215A67222D0" class="l1111d0" points="20340.5,-14800 20345.5,-14800 20345.5,-14798.61 20345.42,-14795.84 20345.27,-14793.06 20345.05,-14790.3 20344.75,-14787.54 20344.37,-14784.79 20343.92,-14782.05 20343.4,-14779.32 20342.8,-14776.61 20342.13,-14773.92 20341.39,-14771.24 20340.57,-14768.59 20339.69,-14765.96 20338.73,-14763.35 20337.7,-14760.77 20336.61,-14758.22 20335.44,-14755.7 20334.21,-14753.22 20332.91,-14750.76 20331.54,-14748.35 20330.11,-14745.97 20328.61,-14743.63 20327.06,-14741.33 20325.44,-14739.08 20323.76,-14736.87 20322.02,-14734.7 20320.22,-14732.59 20318.37,-14730.52 20316.46,-14728.51 20314.49,-14726.54 20312.48,-14724.63 20310.41,-14722.78 20308.3,-14720.98 20306.13,-14719.24 20303.92,-14717.56 20301.67,-14715.94 20299.37,-14714.39 20297.03,-14712.89 20294.65,-14711.46 20292.24,-14710.09 20289.78,-14708.79 20287.3,-14707.56 20284.78,-14706.39 20282.23,-14705.3 20279.65,-14704.27 20277.04,-14703.31 20274.41,-14702.43 20271.76,-14701.61 20269.08,-14700.87 20266.39,-14700.2 20263.68,-14699.6 20260.95,-14699.08 20258.21,-14698.63 20255.46,-14698.25 20252.7,-14697.95 20249.94,-14697.73 20247.16,-14697.58 20244.39,-14697.5 20243,-14697.5 20243,-14702.5 20244.37,-14702.5 20247.1,-14702.58 20249.83,-14702.73 20252.56,-14702.96 20255.28,-14703.27 20257.98,-14703.65 20260.68,-14704.11 20263.36,-14704.64 20266.03,-14705.25 20268.68,-14705.94 20271.3,-14706.69 20273.91,-14707.52 20276.49,-14708.43 20279.05,-14709.4 20281.57,-14710.45 20284.07,-14711.57 20286.53,-14712.75 20288.96,-14714.01 20291.36,-14715.33 20293.71,-14716.72 20296.03,-14718.17 20298.3,-14719.69 20300.53,-14721.28 20302.72,-14722.92 20304.86,-14724.63 20306.95,-14726.39 20308.99,-14728.21 20310.97,-14730.09 20312.91,-14732.03 20314.79,-14734.01 20316.61,-14736.05 20318.37,-14738.14 20320.08,-14740.28 20321.72,-14742.47 20323.31,-14744.7 20324.83,-14746.97 20326.28,-14749.29 20327.67,-14751.64 20328.99,-14754.04 20330.25,-14756.47 20331.43,-14758.93 20332.55,-14761.43 20333.6,-14763.95 20334.57,-14766.51 20335.48,-14769.09 20336.31,-14771.7 20337.06,-14774.32 20337.75,-14776.97 20338.36,-14779.64 20338.89,-14782.32 20339.35,-14785.02 20339.73,-14787.72 20340.04,-14790.44 20340.27,-14793.17 20340.42,-14795.9 20340.5,-14798.63"/>
<polygon id="00000215A67218C0" class="l1111d0" points="20340.5,-15990 20340.5,-14800 20345.5,-14800 20345.5,-15990"/>
<polygon id="00000215A6722030" class="l1111d0" points="20243,-16087.5 20243,-16092.5 20244.39,-16092.5 20247.16,-16092.42 20249.94,-16092.27 20252.7,-16092.05 20255.46,-16091.75 20258.21,-16091.37 20260.95,-16090.92 20263.68,-16090.4 20266.39,-16089.8 20269.08,-16089.13 20271.76,-16088.39 20274.41,-16087.57 20277.04,-16086.69 20279.65,-16085.73 20282.23,-16084.7 20284.78,-16083.61 20287.3,-16082.44 20289.78,-16081.21 20292.24,-16079.91 20294.65,-16078.54 20297.03,-16077.11 20299.37,-16075.61 20301.67,-16074.06 20303.92,-16072.44 20306.13,-16070.76 20308.3,-16069.02 20310.41,-16067.22 20312.48,-16065.37 20314.49,-16063.46 20316.46,-16061.49 20318.37,-16059.48 20320.22,-16057.41 20322.02,-16055.3 20323.76,-16053.13 20325.44,-16050.92 20327.06,-16048.67 20328.61,-16046.37 20330.11,-16044.03 20331.54,-16041.65 20332.91,-16039.24 20334.21,-16036.78 20335.44,-16034.3 20336.61,-16031.78 20337.7,-16029.23 20338.73,-16026.65 20339.69,-16024.04 20340.57,-16021.41 20341.39,-16018.76 20342.13,-16016.08 20342.8,-16013.39 20343.4,-16010.68 20343.92,-16007.95 20344.37,-16005.21 20344.75,-16002.46 20345.05,-15999.7 20345.27,-15996.94 20345.42,-15994.16 20345.5,-15991.39 20345.5,-15990 20340.5,-15990 20340.5,-15991.37 20340.42,-15994.1 20340.27,-15996.83 20340.04,-15999.56 20339.73,-16002.28 20339.35,-16004.98 20338.89,-16007.68 20338.36,-16010.36 20337.75,-16013.03 20337.06,-16015.68 20336.31,-16018.3 20335.48,-16020.91 20334.57,-16023.49 20333.6,-16026.05 20332.55,-16028.57 20331.43,-16031.07 20330.25,-16033.53 20328.99,-16035.96 20327.67,-16038.36 20326.28,-16040.71 20324.83,-16043.03 20323.31,-16045.3 20321.72,-16047.53 20320.08,-16049.72 20318.37,-16051.86 20316.61,-16053.95 20314.79,-16055.99 20312.91,-16057.97 20310.97,-16059.91 20308.99,-16061.79 20306.95,-16063.61 20304.86,-16065.37 20302.72,-16067.08 20300.53,-16068.72 20298.3,-16070.31 20296.03,-16071.83 20293.71,-16073.28 20291.36,-16074.67 20288.96,-16075.99 20286.53,-16077.25 20284.07,-16078.43 20281.57,-16079.55 20279.05,-16080.6 20276.49,-16081.57 20273.91,-16082.48 20271.3,-16083.31 20268.68,-16084.06 20266.03,-16084.75 20263.36,-16085.36 20260.68,-16085.89 20257.98,-16086.35 20255.28,-16086.73 20252.56,-16087.04 20249.83,-16087.27 20247.1,-16087.42 20244.37,-16087.5"/>
<polygon id="00000215A6721A80" class="l1111d0" points="16810,-14775 14421,-14775 14421,-14625 16810,-14625"/>
<polygon id="00000215A6720F90" class="l1111d0" points="16835,-14800 16985,-14800 16985,-14798.17 16984.92,-14794.5 16984.77,-14790.84 16984.54,-14787.18 16984.23,-14783.53 16983.85,-14779.89 16983.39,-14776.25 16982.85,-14772.62 16982.24,-14769.01 16981.55,-14765.41 16980.79,-14761.82 16979.95,-14758.26 16979.04,-14754.71 16978.06,-14751.17 16977,-14747.67 16975.87,-14744.18 16974.66,-14740.72 16973.38,-14737.28 16972.03,-14733.88 16970.61,-14730.5 16969.12,-14727.15 16967.56,-14723.83 16965.93,-14720.55 16964.23,-14717.3 16962.47,-14714.09 16960.64,-14710.91 16958.74,-14707.78 16956.77,-14704.68 16954.74,-14701.63 16952.65,-14698.62 16950.5,-14695.66 16948.28,-14692.74 16946.01,-14689.86 16943.67,-14687.04 16941.27,-14684.27 16938.82,-14681.54 16936.31,-14678.87 16933.75,-14676.25 16931.13,-14673.69 16928.46,-14671.18 16925.73,-14668.73 16922.96,-14666.33 16920.14,-14663.99 16917.26,-14661.72 16914.34,-14659.5 16911.38,-14657.35 16908.37,-14655.26 16905.32,-14653.23 16902.22,-14651.26 16899.09,-14649.36 16895.91,-14647.53 16892.7,-14645.77 16889.45,-14644.07 16886.17,-14642.44 16882.85,-14640.88 16879.5,-14639.39 16876.12,-14637.97 16872.72,-14636.62 16869.28,-14635.34 16865.82,-14634.13 16862.33,-14633 16858.83,-14631.94 16855.29,-14630.96 16851.74,-14630.05 16848.18,-14629.21 16844.59,-14628.45 16840.99,-14627.76 16837.38,-14627.15 16833.75,-14626.61 16830.11,-14626.15 16826.47,-14625.77 16822.82,-14625.46 16819.16,-14625.23 16815.5,-14625.08 16811.83,-14625 16810,-14625 16810,-14775 16810.68,-14775 16812.03,-14775.08 16813.38,-14775.22 16814.71,-14775.44 16816.03,-14775.73 16817.34,-14776.1 16818.62,-14776.53 16819.88,-14777.03 16821.11,-14777.6 16822.31,-14778.23 16823.47,-14778.93 16824.59,-14779.69 16825.67,-14780.51 16826.7,-14781.39 16827.68,-14782.32 16828.61,-14783.3 16829.49,-14784.33 16830.31,-14785.41 16831.07,-14786.53 16831.77,-14787.69 16832.4,-14788.89 16832.97,-14790.12 16833.47,-14791.38 16833.9,-14792.66 16834.27,-14793.97 16834.56,-14795.29 16834.78,-14796.62 16834.92,-14797.97 16835,-14799.32"/>
<polygon id="00000215A6721930" class="l1111d0" points="16835,-16235 16835,-14800 16985,-14800 16985,-16235"/>
<polygon id="00000215A67214D0" class="l1111d0" points="16810,-16260 16810,-16410 16811.83,-16410 16815.5,-16409.92 16819.16,-16409.77 16822.82,-16409.54 16826.47,-16409.23 16830.11,-16408.85 16833.75,-16408.39 16837.38,-16407.85 16840.99,-16407.24 16844.59,-16406.55 16848.18,-16405.79 16851.74,-16404.95 16855.29,-16404.04 16858.83,-16403.06 16862.33,-16402 16865.82,-16400.87 16869.28,-16399.66 16872.72,-16398.38 16876.12,-16397.03 16879.5,-16395.61 16882.85,-16394.12 16886.17,-16392.56 16889.45,-16390.93 16892.7,-16389.23 16895.91,-16387.47 16899.09,-16385.64 16902.22,-16383.74 16905.32,-16381.77 16908.37,-16379.74 16911.38,-16377.65 16914.34,-16375.5 16917.26,-16373.28 16920.14,-16371.01 16922.96,-16368.67 16925.73,-16366.27 16928.46,-16363.82 16931.13,-16361.31 16933.75,-16358.75 16936.31,-16356.13 16938.82,-16353.46 16941.27,-16350.73 16943.67,-16347.96 16946.01,-16345.14 16948.28,-16342.26 16950.5,-16339.34 16952.65,-16336.38 16954.74,-16333.37 16956.77,-16330.32 16958.74,-16327.22 16960.64,-16324.09 16962.47,-16320.91 16964.23,-16317.7 16965.93,-16314.45 16967.56,-16311.17 16969.12,-16307.85 16970.61,-16304.5 16972.03,-16301.12 16973.38,-16297.72 16974.66,-16294.28 16975.87,-16290.82 16977,-16287.33 16978.06,-16283.83 16979.04,-16280.29 16979.95,-16276.74 16980.79,-16273.18 16981.55,-16269.59 16982.24,-16265.99 16982.85,-16262.38 16983.39,-16258.75 16983.85,-16255.11 16984.23,-16251.47 16984.54,-16247.82 16984.77,-16244.16 16984.92,-16240.5 16985,-16236.83 16985,-16235 16835,-16235 16835,-16235.68 16834.92,-16237.03 16834.78,-16238.38 16834.56,-16239.71 16834.27,-16241.03 16833.9,-16242.34 16833.47,-16243.62 16832.97,-16244.88 16832.4,-16246.11 16831.77,-16247.31 16831.07,-16248.47 16830.31,-16249.59 16829.49,-16250.67 16828.61,-16251.7 16827.68,-16252.68 16826.7,-16253.61 16825.67,-16254.49 16824.59,-16255.31 16823.47,-16256.07 16822.31,-16256.77 16821.11,-16257.4 16819.88,-16257.97 16818.62,-16258.47 16817.34,-16258.9 16816.03,-16259.27 16814.71,-16259.56 16813.38,-16259.78 16812.03,-16259.92 16810.68,-16260"/>
<polygon id="00000215A67220A0" class="l1111d0" points="15610,-14775 14421,-14775 14421,-14625 15610,-14625"/>
<polygon id="00000215A6722650" class="l1111d0" points="15635,-14800 15785,-14800 15785,-14798.17 15784.92,-14794.5 15784.77,-14790.84 15784.54,-14787.18 15784.23,-14783.53 15783.85,-14779.89 15783.39,-14776.25 15782.85,-14772.62 15782.24,-14769.01 15781.55,-14765.41 15780.79,-14761.82 15779.95,-14758.26 15779.04,-14754.71 15778.06,-14751.17 15777,-14747.67 15775.87,-14744.18 15774.66,-14740.72 15773.38,-14737.28 15772.03,-14733.88 15770.61,-14730.5 15769.12,-14727.15 15767.56,-14723.83 15765.93,-14720.55 15764.23,-14717.3 15762.47,-14714.09 15760.64,-14710.91 15758.74,-14707.78 15756.77,-14704.68 15754.74,-14701.63 15752.65,-14698.62 15750.5,-14695.66 15748.28,-14692.74 15746.01,-14689.86 15743.67,-14687.04 15741.27,-14684.27 15738.82,-14681.54 15736.31,-14678.87 15733.75,-14676.25 15731.13,-14673.69 15728.46,-14671.18 15725.73,-14668.73 15722.96,-14666.33 15720.14,-14663.99 15717.26,-14661.72 15714.34,-14659.5 15711.38,-14657.35 15708.37,-14655.26 15705.32,-14653.23 15702.22,-14651.26 15699.09,-14649.36 15695.91,-14647.53 15692.7,-14645.77 15689.45,-14644.07 15686.17,-14642.44 15682.85,-14640.88 15679.5,-14639.39 15676.12,-14637.97 15672.72,-14636.62 15669.28,-14635.34 15665.82,-14634.13 15662.33,-14633 15658.83,-14631.94 15655.29,-14630.96 15651.74,-14630.05 15648.18,-14629.21 15644.59,-14628.45 15640.99,-14627.76 15637.38,-14627.15 15633.75,-14626.61 15630.11,-14626.15 15626.47,-14625.77 15622.82,-14625.46 15619.16,-14625.23 15615.5,-14625.08 15611.83,-14625 15610,-14625 15610,-14775 15610.68,-14775 15612.03,-14775.08 15613.38,-14775.22 15614.71,-14775.44 15616.03,-14775.73 15617.34,-14776.1 15618.62,-14776.53 15619.88,-14777.03 15621.11,-14777.6 15622.31,-14778.23 15623.47,-14778.93 15624.59,-14779.69 15625.67,-14780.51 15626.7,-14781.39 15627.68,-14782.32 15628.61,-14783.3 15629.49,-14784.33 15630.31,-14785.41 15631.07,-14786.53 15631.77,-14787.69 15632.4,-14788.89 15632.97,-14790.12 15633.47,-14791.38 15633.9,-14792.66 15634.27,-14793.97 15634.56,-14795.29 15634.78,-14796.62 15634.92,-14797.97 15635,-14799.32"/>
<polygon id="00000215A67226C0" class="l1111d0" points="15635,-16235 15635,-14800 15785,-14800 15785,-16235"/>
<polygon id="00000215A6721FC0" class="l1111d0" points="15810,-16260 15810,-16410 15808.17,-16410 15804.5,-16409.92 15800.84,-16409.77 15797.18,-16409.54 15793.53,-16409.23 15789.89,-16408.85 15786.25,-16408.39 15782.62,-16407.85 15779.01,-16407.24 15775.41,-16406.55 15771.82,-16405.79 15768.26,-16404.95 15764.71,-16404.04 15761.17,-16403.06 15757.67,-16402 15754.18,-16400.87 15750.72,-16399.66 15747.28,-16398.38 15743.88,-16397.03 15740.5,-16395.61 15737.15,-16394.12 15733.83,-16392.56 15730.55,-16390.93 15727.3,-16389.23 15724.09,-16387.47 15720.91,-16385.64 15717.78,-16383.74 15714.68,-16381.77 15711.63,-16379.74 15708.62,-16377.65 15705.66,-16375.5 15702.74,-16373.28 15699.86,-16371.01 15697.04,-16368.67 15694.27,-16366.27 15691.54,-16363.82 15688.87,-16361.31 15686.25,-16358.75 15683.69,-16356.13 15681.18,-16353.46 15678.73,-16350.73 15676.33,-16347.96 15673.99,-16345.14 15671.72,-16342.26 15669.5,-16339.34 15667.35,-16336.38 15665.26,-16333.37 15663.23,-16330.32 15661.26,-16327.22 15659.36,-16324.09 15657.53,-16320.91 15655.77,-16317.7 15654.07,-16314.45 15652.44,-16311.17 15650.88,-16307.85 15649.39,-16304.5 15647.97,-16301.12 15646.62,-16297.72 15645.34,-16294.28 15644.13,-16290.82 15643,-16287.33 15641.94,-16283.83 15640.96,-16280.29 15640.05,-16276.74 15639.21,-16273.18 15638.45,-16269.59 15637.76,-16265.99 15637.15,-16262.38 15636.61,-16258.75 15636.15,-16255.11 15635.77,-16251.47 15635.46,-16247.82 15635.23,-16244.16 15635.08,-16240.5 15635,-16236.83 15635,-16235 15785,-16235 15785,-16235.68 15785.08,-16237.03 15785.22,-16238.38 15785.44,-16239.71 15785.73,-16241.03 15786.1,-16242.34 15786.53,-16243.62 15787.03,-16244.88 15787.6,-16246.11 15788.23,-16247.31 15788.93,-16248.47 15789.69,-16249.59 15790.51,-16250.67 15791.39,-16251.7 15792.32,-16252.68 15793.3,-16253.61 15794.33,-16254.49 15795.41,-16255.31 15796.53,-16256.07 15797.69,-16256.77 15798.89,-16257.4 15800.12,-16257.97 15801.38,-16258.47 15802.66,-16258.9 15803.97,-16259.27 15805.29,-16259.56 15806.62,-16259.78 15807.97,-16259.92 15809.32,-16260"/>
<polygon id="00000215A6722110" class="l1111d0" points="15810,-16260 16810,-16260 16810,-16410 15810,-16410"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,136 @@
# =============================================
# mxPIC Cell/Project Definition File
# =============================================
schema_version: "2.0.0"
kind: cell
coordinate_system: gds_y_up
canvas_size:
width: 5000
height: 5000
project: mxpic_project_1
name: canvas_2
type: composite
version: "1.0.0"
# 1. External Ports (How this cell connects to the outside world)
pins:
- name: port_io1
layer: WG_CORE
element: port
pin: io1
x: 50.0
y: -150.0
angle: 0.0
width: 0.5
- name: port_2_io1
layer: WG_CORE
element: port_2
pin: io1
x: 1442.1
y: -1470.0
angle: 180.0
width: 10
- name: port_3_io1
layer: WG_CORE
element: port_3
pin: io1
x: 2024.3
y: -1609.0
angle: 180.0
width: 0.5
# 2. Instances (The sub-components dropped onto this canvas)
instances:
waveguide_3:
component: waveguide
x: 1581.0
y: -1633.5
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length: 100
width: 15
xsection: "strip"
elements:
port:
type: port
x: 50.0
y: -150.0
angle: 0.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 0.5
description: ""
pins:
- name: port_io1
role: io1
port:
type: port
x: 50.0
y: -150.0
angle: 180.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 0.5
description: ""
pins:
- name: port_io1
role: io1
port_2:
type: port
x: 1442.1
y: -1470.0
angle: 0.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 10
description: ""
pins:
- name: port_2_io1
role: io1
port_3:
type: port
x: 2024.3
y: -1609.0
angle: 0.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 0.5
description: ""
pins:
- name: port_3_io1
role: io1
# 3. Bundles (Grouped links for multi-bus/parallel routing)
bundles:
output_bus:
routing_type: euler_bend
links:
- from: waveguide_3:a1
to: port_2:port_2_io1
xsection: strip
family: optical
width: 15
radius: 10
routing_type: euler_bend
- from: waveguide_3:b1
to: port_2:port_2_io1
xsection: strip
family: optical
width: 15
radius: 10
routing_type: euler_bend
- from: port_3:port_3_io1
to: port_2:port_2_io1
xsection: strip
family: optical
width: 0.5
radius: 10
routing_type: euler_bend
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 79 KiB

@@ -13,6 +13,7 @@ type: project
version: "1.0.0" version: "1.0.0"
# 1. External Ports (How this cell connects to the outside world) # 1. External Ports (How this cell connects to the outside world)
<<<<<<< HEAD
ports: [] ports: []
# 2. Instances (The sub-components dropped onto this canvas) # 2. Instances (The sub-components dropped onto this canvas)
@@ -21,6 +22,47 @@ instances:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 1511.5 x: 1511.5
y: -2531.5 y: -2531.5
=======
pins:
- name: port_1_io1
layer: WG_CORE
element: port_1
pin: io1
x: 1699.6
y: -1844.2
angle: 180.0
width: 0.5
# 2. Instances (The sub-components dropped onto this canvas)
instances:
circle_1:
component: circle
x: 1877.6
y: -1816.7
rotation: 90.0
flip: 0
flop: 0
mirror: false
settings:
radius: 10
width: 0.5
xsection: "strip"
BD_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/bendings/SiN_EUB_1310_H400_w2500_L45_QY_202604
x: 1926.2
y: -1813.9
rotation: 90.0
flip: 0
flop: 0
mirror: false
settings:
length:
DC_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/directional_couplers/DC_SiN400_99_1_1310_jyh_quantex_202603
x: 1766.5
y: -1945.3
rotation: 0.0 rotation: 0.0
flip: 0 flip: 0
flop: 0 flop: 0
@@ -28,10 +70,51 @@ instances:
settings: settings:
length: length:
MZM_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/composites/Mach_Zender_modulators/MZI_SiN400_Si220_PIN_mod_1310_L1300_QY_202603
x: 1341.6
y: -2103.8
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
phase_shifter_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/phase_shifters/HT_150R_SiPPP_L500_100OHM_DUMMY_QY_202604
x: 2695.0
y: -2275.0
rotation: 90.0
flip: 0
flop: 0
mirror: false
settings:
length:
MMI_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 2849.0
y: -1988.6
>>>>>>> jingwen_main
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
<<<<<<< HEAD
MMI_2: MMI_2:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2 component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/multimode_interferometers/1x2MMI_1310nm_TE_Silterra_202603_ZKY_v2
x: 1716.4 x: 1716.4
y: -2293.8 y: -2293.8
=======
DC_2:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/directional_couplers/DC_SiN400_99_1_1310_jyh_quantex_202603
x: 2656.9
y: -1992.8
>>>>>>> jingwen_main
rotation: 0.0 rotation: 0.0
flip: 0 flip: 0
flop: 0 flop: 0
@@ -39,13 +122,42 @@ instances:
settings: settings:
length: length:
<<<<<<< HEAD
elements: {} elements: {}
=======
PD_1:
component: Silterra/EMO1_2ML_CU_Al_RDL/primitives/photodetectors/PD_1310_Monitor_Si220_Ge500_NPN_XHN_202604
x: 3151.7
y: -2032.1
rotation: 0.0
flip: 0
flop: 0
mirror: false
settings:
length:
elements:
port_1:
type: port
x: 1699.6
y: -1844.2
angle: 0.0
pin_number: 1
pitch: 10
layer: WG_CORE
width: 0.5
description: ""
pins:
- name: port_1_io1
role: io1
>>>>>>> jingwen_main
# 3. Bundles (Grouped links for multi-bus/parallel routing) # 3. Bundles (Grouped links for multi-bus/parallel routing)
bundles: bundles:
output_bus: output_bus:
routing_type: euler_bend routing_type: euler_bend
links: links:
<<<<<<< HEAD
- from: MMI_2:a1 - from: MMI_2:a1
to: MMI_1:b2 to: MMI_1:b2
xsection: strip xsection: strip
@@ -53,3 +165,5 @@ bundles:
width: 0.45 width: 0.45
radius: 10 radius: 10
routing_type: euler_bend routing_type: euler_bend
=======
>>>>>>> jingwen_main
Binary file not shown.
+31 -14
View File
@@ -42,11 +42,14 @@
name: 'Anchor', name: 'Anchor',
elementType: 'anchor', elementType: 'anchor',
ports: { ports: {
a1: { x: 0, y: -PORT_NODE_SIZE / 2, a: 180, width: 0.5 }, a1: { x: 0, y: 0, a: 180, width: 0.5 },
b1: { x: 0, y: -PORT_NODE_SIZE / 2, a: 0, width: 0.5 } b1: { x: 0, y: 0, a: 0, width: 0.5 }
} }
} }
}; };
// Defines local primitive components that do not require PDK lookup. // Defines local primitive components that do not require PDK lookup.
const BASIC_COMPONENTS = { const BASIC_COMPONENTS = {
waveguide: { waveguide: {
@@ -804,16 +807,13 @@
} }
}; };
} }
if (portNumber > 1) { const entries = [];
const entries = []; Array.from({ length: portNumber }, (_, index) => {
Array.from({ length: portNumber }, (_, index) => { const y = elementPortOffset(index, portNumber, pitch);
const y = elementPortOffset(index, portNumber, pitch); entries.push([`a${index + 1}`, { x: 0, y, a: 180, width }]);
entries.push([`a${index + 1}`, { x: 0, y, a: 180, width }]); entries.push([`b${index + 1}`, { x: 0, y, a: 0, width }]);
entries.push([`b${index + 1}`, { x: 0, y, a: 0, width }]); });
}); return Object.fromEntries(entries);
return Object.fromEntries(entries);
}
return JSON.parse(JSON.stringify(element.ports));
}; };
// Generate port metadata for built-in primitive components. // Generate port metadata for built-in primitive components.
@@ -984,6 +984,20 @@ ${pinLines}`;
return `elements:\n${lines.join('\n')}`; return `elements:\n${lines.join('\n')}`;
}; };
const finiteNumberOrNull = (value) => {
const number = Number(value);
return Number.isFinite(number) ? number : null;
};
const getRouteEndpointWidth = (node, handleId) => {
if (!node || !node.data) return null;
const dataWidth = finiteNumberOrNull(node.data.width);
if (dataWidth !== null) return dataWidth;
const ports = node.data.ports || {};
const portWidth = ports[handleId] ? finiteNumberOrNull(ports[handleId].width) : null;
return portWidth;
};
// Serialize canvas links into routed bundle YAML including route settings and bend points. // Serialize canvas links into routed bundle YAML including route settings and bend points.
const buildBundlesYaml = (page, manifest) => { const buildBundlesYaml = (page, manifest) => {
const { nodes = [], edges = [] } = page || {}; const { nodes = [], edges = [] } = page || {};
@@ -1004,6 +1018,9 @@ ${pinLines}`;
? getElementPinName(targetNode, edge.targetHandle) ? getElementPinName(targetNode, edge.targetHandle)
: edge.targetHandle || 'unknown'; : edge.targetHandle || 'unknown';
const route = createRouteSettings(manifest, edge.data && edge.data.route); const route = createRouteSettings(manifest, edge.data && edge.data.route);
const routeWidth = getRouteEndpointWidth(sourceNode, edge.sourceHandle)
?? getRouteEndpointWidth(targetNode, edge.targetHandle)
?? route.width;
const storedPoints = Array.isArray(edge.data && edge.data.points) ? edge.data.points : []; const storedPoints = Array.isArray(edge.data && edge.data.points) ? edge.data.points : [];
const points = storedPoints.length >= 2 ? getEdgeRoutePoints(edge, nodeMap) : []; const points = storedPoints.length >= 2 ? getEdgeRoutePoints(edge, nodeMap) : [];
const pointsYaml = points.length > 0 const pointsYaml = points.length > 0
@@ -1014,7 +1031,7 @@ ${pinLines}`;
return ` - id: ${toYamlScalar(edge.id)} return ` - id: ${toYamlScalar(edge.id)}
xsection: ${route.xsection} xsection: ${route.xsection}
family: ${route.family} family: ${route.family}
width: ${Number(route.width)} width: ${Number(routeWidth)}
radius: ${Number(route.radius)} radius: ${Number(route.radius)}
routing_type: ${route.routing_type}${pointsYaml}`; routing_type: ${route.routing_type}${pointsYaml}`;
} }
@@ -1022,7 +1039,7 @@ ${pinLines}`;
to: ${targetName}:${toPort} to: ${targetName}:${toPort}
xsection: ${route.xsection} xsection: ${route.xsection}
family: ${route.family} family: ${route.family}
width: ${Number(route.width)} width: ${Number(routeWidth)}
radius: ${Number(route.radius)} radius: ${Number(route.radius)}
routing_type: ${route.routing_type}${pointsYaml}`; routing_type: ${route.routing_type}${pointsYaml}`;
}); });
+116 -83
View File
@@ -1622,7 +1622,7 @@ Organization : OptiHK Limited
// Displays a category icon with cached loading and graceful failure behavior. // Displays a category icon with cached loading and graceful failure behavior.
const IconImg = memo(({ category, containerStyle }) => { const IconImg = memo(({ category, containerStyle, objectFit: imgObjectFit }) => {
const [src, setSrc] = useState(() => { const [src, setSrc] = useState(() => {
if (!category) return undefined; if (!category) return undefined;
const cache = fetchIcon(category); const cache = fetchIcon(category);
@@ -1671,7 +1671,7 @@ Organization : OptiHK Limited
style={{ style={{
width: '100%', width: '100%',
height: '100%', height: '100%',
objectFit: 'fill', objectFit: imgObjectFit || 'fill',
pointerEvents: 'none', pointerEvents: 'none',
}} }}
onError={(e) => { onError={(e) => {
@@ -1764,42 +1764,46 @@ Organization : OptiHK Limited
width: componentSize.width, width: componentSize.width,
height: visualSize.height, height: visualSize.height,
minHeight: visualSize.height, minHeight: visualSize.height,
overflow: 'hidden',
...(visualSize.height < 50 && !isAnchorElement ? { padding: '2px 4px' } : {}),
border: selected ? '2px solid var(--accent)' : '1px solid var(--border)', border: selected ? '2px solid var(--accent)' : '1px solid var(--border)',
transform: componentVisualTransform,
boxShadow: selected ? '0 0 15px rgba(56, 189, 248, 0.2)' : '0 4px 6px rgba(0,0,0,0.3)', boxShadow: selected ? '0 0 15px rgba(56, 189, 248, 0.2)' : '0 4px 6px rgba(0,0,0,0.3)',
...(isBasicCompactComponent ? { transform: componentVisualTransform,
padding: 0, transformOrigin: 'center center',
display: 'flex', ...(isBasicCompactComponent ? {
alignItems: 'center', padding: 0,
justifyContent: 'center' display: 'flex',
} : {}), alignItems: 'center',
...(isAnchorElement ? { justifyContent: 'center'
width: PORT_NODE_SIZE, } : {}),
minHeight: PORT_NODE_SIZE, ...(isAnchorElement ? {
padding: 0, width: PORT_NODE_SIZE,
borderRadius: '50%', minHeight: PORT_NODE_SIZE,
display: 'flex', padding: 0,
alignItems: 'center', borderRadius: '50%',
justifyContent: 'center' display: 'flex',
} : {}), alignItems: 'center',
}} justifyContent: 'center'
> } : {}),
{isAnchorElement ? ( }}
<span style={{ fontSize: 8, fontWeight: 800, color: selected ? 'var(--accent)' : 'var(--text-main)' }}>A</span> >
) : ( {isAnchorElement ? (
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: '8px', minHeight: '100%' }}> <span style={{ fontSize: 8, fontWeight: 800, color: selected ? 'var(--accent)' : 'var(--text-main)' }}>A</span>
{!data.hideIcon && data.category && ( ) : (
<div style={{ width: iconSize.width, height: iconSize.height }}> <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: '8px', minHeight: '100%' }}>
<IconImg category={data.category} /> {!data.hideIcon && data.category && (
<div style={{ maxWidth: iconSize.width, maxHeight: iconSize.height, width: '100%', aspectRatio: `${iconSize.width}/${iconSize.height}`, overflow: 'hidden' }}>
<IconImg category={data.category} objectFit="contain" />
</div>
)}
{!data.category && <div style={{ width: iconSize.width, height: iconSize.height, borderRadius: 4, border: '1px solid var(--border-strong)', background: 'rgba(148, 163, 184, 0.08)' }} />}
</div> </div>
)} )}
{!data.category && <div style={{ width: iconSize.width, height: iconSize.height, borderRadius: 4, border: '1px solid var(--border-strong)', background: 'rgba(148, 163, 184, 0.08)' }} />} </div>
</div>
)}
</div>
<div style={{ <div style={{
position: 'absolute', inset: 0, position: 'absolute',
top: 0, left: 0,
width: componentSize.width, width: componentSize.width,
height: visualSize.height, height: visualSize.height,
pointerEvents: 'none' pointerEvents: 'none'
@@ -1985,29 +1989,22 @@ Organization : OptiHK Limited
const name = String(portName || ''); const name = String(portName || '');
return name.startsWith('a') || name.startsWith('left') ? 'left' : 'right'; return name.startsWith('a') || name.startsWith('left') ? 'left' : 'right';
}; };
const anchorHandleVisualStyle = (portHandle, zIndex) => { const anchorHandleVisualStyle = (portHandle, zIndex) => ({
const visualSide = anchorPortVisualSide(portHandle.name); ...baseHandleStyle,
const localLeft = visualSide === 'left' ? 0 : elementSize.width; zIndex,
const localTop = portHandle.style?.top || '50%'; left: portHandle.style?.left,
return { top: portHandle.style?.top || '50%',
...baseHandleStyle, right: portHandle.style?.right || 'auto',
zIndex, bottom: portHandle.style?.bottom || 'auto',
left: localLeft, transform: portHandle.style?.transform || 'translate(-50%, -50%)'
top: localTop, });
right: 'auto',
bottom: 'auto',
transform: 'translate(-50%, -50%)'
};
};
const pinLabelStyle = (portHandle) => { const pinLabelStyle = (portHandle) => {
const visualSide = anchorPortVisualSide(portHandle.name); const visualSide = anchorPortVisualSide(portHandle.name);
const localLeft = visualSide === 'left' ? 0 : elementSize.width;
const localTop = portHandle.style?.top || '50%';
return { return {
left: localLeft, left: portHandle.style?.left,
top: localTop, top: portHandle.style?.top || '50%',
right: 'auto', right: portHandle.style?.right || 'auto',
bottom: 'auto', bottom: portHandle.style?.bottom || 'auto',
transform: visualSide === 'left' ? 'translate(calc(-100% - 5px), -50%)' : 'translate(5px, -50%)' transform: visualSide === 'left' ? 'translate(calc(-100% - 5px), -50%)' : 'translate(5px, -50%)'
}; };
}; };
@@ -3359,6 +3356,7 @@ Organization : OptiHK Limited
const forge = isForgeComponent(componentName); const forge = isForgeComponent(componentName);
onUpdateNode(selectedNode.id, { onUpdateNode(selectedNode.id, {
data: { data: {
...selectedNode.data,
componentName, componentName,
label: componentName, label: componentName,
ports: forge ? {} : undefined, ports: forge ? {} : undefined,
@@ -3760,8 +3758,6 @@ Organization : OptiHK Limited
const initializedRef = useRef(false); const initializedRef = useRef(false);
const canvasViewportRef = useRef(null); const canvasViewportRef = useRef(null);
const buildLayoutRequestRef = useRef(0);
const buildLayoutBusyRef = useRef(false);
const edgeTypes = useMemo(() => ({ parallelRoute: ParallelRouteEdge }), []); const edgeTypes = useMemo(() => ({ parallelRoute: ParallelRouteEdge }), []);
const activePage = useMemo(() => pages.find(p => p.id === activePageId) || null, [pages, activePageId]); const activePage = useMemo(() => pages.find(p => p.id === activePageId) || null, [pages, activePageId]);
@@ -3807,6 +3803,14 @@ Organization : OptiHK Limited
} }
: null : null
), [mouseCanvasPoint, canvasOrigin]); ), [mouseCanvasPoint, canvasOrigin]);
const handleCanvasViewportMoveEnd = useCallback((event, viewport) => {
if (!activePageId || !viewport) return;
setPages(prev => prev.map(page => (
page.id === activePageId
? { ...page, viewport: { x: viewport.x, y: viewport.y, zoom: viewport.zoom } }
: page
)));
}, [activePageId]);
// Normalizes free-route control points and removes adjacent duplicates before storage. // Normalizes free-route control points and removes adjacent duplicates before storage.
const compactRoutePoints = useCallback((points) => { const compactRoutePoints = useCallback((points) => {
return (points || []) return (points || [])
@@ -5058,6 +5062,35 @@ Organization : OptiHK Limited
return boxSize ? { ...node, data: { ...node.data, boxSize } } : node; return boxSize ? { ...node, data: { ...node.data, boxSize } } : node;
}) })
})); }));
// Pre-fetch PDK component metadata so nodes render with correct boxSize immediately.
const allNodes = cellPages.flatMap(page => page.nodes);
const pdkNames = [...new Set(allNodes
.filter(n => n.data?.componentName && !n.data?.elementType
&& !isForgeComponent(n.data.componentName)
&& !isBasicComponent(n.data.componentName))
.map(n => n.data.componentName))];
if (pdkNames.length > 0) {
const metaResults = await Promise.all(
pdkNames.map(name => loadComponentMetadata(name).catch(() => null))
);
const metaMap = new Map(
pdkNames.filter((_, i) => metaResults[i]).map((name, i) => [name, metaResults[i]])
);
for (const page of cellPages) {
page.nodes = page.nodes.map(node => {
const metadata = metaMap.get(node.data?.componentName);
if (!metadata) return node;
const sz = normalizeBoxSize(metadata);
return {
...node,
position: clampPositionToCanvas(node.position, page.canvasSize || DEFAULT_CANVAS_SIZE, sz),
data: { ...node.data, boxSize: sz, ports: metadata.pins || metadata.ports || {}, foundry: metadata.foundry || '', process: metadata.process || '' }
};
});
}
}
const loadedProjectPage = cellPages.find(page => page.type === 'project' && page.name === currentProjectName); const loadedProjectPage = cellPages.find(page => page.type === 'project' && page.name === currentProjectName);
const nonProjectPages = cellPages.filter(page => page !== loadedProjectPage); const nonProjectPages = cellPages.filter(page => page !== loadedProjectPage);
const resolvedProjectPage = loadedProjectPage || projectPage; const resolvedProjectPage = loadedProjectPage || projectPage;
@@ -5084,12 +5117,18 @@ Organization : OptiHK Limited
useEffect(() => { useEffect(() => {
if (activePage && activePage.type !== 'layoutPreview' && reactFlowInstance) { if (activePage && activePage.type !== 'layoutPreview' && reactFlowInstance) {
reactFlowInstance.fitBounds( if (activePage.viewport) {
{ x: 0, y: 0, width: activeCanvasSize.width, height: activeCanvasSize.height }, window.requestAnimationFrame(() => {
{ padding: 0.12, duration: 0 } reactFlowInstance.setViewport(activePage.viewport, { duration: 0 });
); });
} else {
reactFlowInstance.fitBounds(
{ x: 0, y: 0, width: activeCanvasSize.width, height: activeCanvasSize.height },
{ padding: 0.12, duration: 0 }
);
}
} }
}, [activePage?.id, activeCanvasSize.width, activeCanvasSize.height, reactFlowInstance]); }, [activePage?.id, activePage?.viewport, activeCanvasSize.width, activeCanvasSize.height, reactFlowInstance]);
useEffect(() => { useEffect(() => {
setRulerStartPoint(null); setRulerStartPoint(null);
@@ -5176,12 +5215,20 @@ Organization : OptiHK Limited
}; };
}) })
}))); })));
// Force React Flow to re-measure nodes whose boxSize / ports have changed.
requestAnimationFrame(() => {
const updatedIds = results.filter(r => r.metadata).map(r => r.nodeId);
if (updatedIds.length > 0 && reactFlowInstance.updateNodeInternals) {
reactFlowInstance.updateNodeInternals(updatedIds);
}
});
}); });
return () => { return () => {
cancelled = true; cancelled = true;
}; };
}, [pages, loadComponentMetadata]); }, [pages, loadComponentMetadata, reactFlowInstance]);
const openTabs = useMemo(() => pages.filter(page => !page.isClosed), [pages]); const openTabs = useMemo(() => pages.filter(page => !page.isClosed), [pages]);
@@ -6210,64 +6257,49 @@ ${bundlesBlock}`;
// Save the active page, generate layout preview assets, and show the preview tab. // Save the active page, generate layout preview assets, and show the preview tab.
const handleBuildLayout = useCallback(async () => { const handleBuildLayout = useCallback(async () => {
if (!activePage) return; if (!activePage) return;
if (buildLayoutBusyRef.current) return; if (buildLayoutBusy) return;
if (!validateRouteCrossings(activePage)) return; if (!validateRouteCrossings(activePage)) return;
const buildPage = activePage;
const buildRequestId = buildLayoutRequestRef.current + 1;
buildLayoutRequestRef.current = buildRequestId;
buildLayoutBusyRef.current = true;
setBuildLayoutBusy(true); setBuildLayoutBusy(true);
startBuildProgress('Building layout'); startBuildProgress('Building layout');
const yamlContent = buildYamlForPage(buildPage); const yamlContent = buildYamlForPage(activePage);
const layoutBounds = calculateLayoutBounds(buildPage);
// send to backend // send to backend
try { try {
const response = await fetch('/api/save-layout', { const response = await fetch('/api/save-layout', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
cache: 'no-store',
body: JSON.stringify({ body: JSON.stringify({
project: currentProjectName, project: currentProjectName,
cell: buildPage.name, cell: activePage.name,
content: yamlContent, content: yamlContent,
}), }),
}); });
if (!response.ok) { if (!response.ok) {
const errData = await response.json().catch(() => ({})); const errData = await response.json();
if (buildRequestId !== buildLayoutRequestRef.current) return;
addLog(errData.error || 'Save failed, unknown error'); addLog(errData.error || 'Save failed, unknown error');
stopBuildProgress(); stopBuildProgress();
return; return;
} }
const result = await response.json(); const result = await response.json();
if (buildRequestId !== buildLayoutRequestRef.current) return;
addLog('Successfully saved: ' + result.path); addLog('Successfully saved: ' + result.path);
if (result.preview_error) { if (result.preview_error) {
addLog('Preview skipped: ' + result.preview_error); addLog('Preview skipped: ' + result.preview_error);
} }
if (result.svg_ready && result.svg_url) { if (result.svg_url) {
completeBuildProgress('Layout ready'); completeBuildProgress('Layout ready');
openLayoutPreview(buildPage.name, result.svg_url, layoutBounds); openLayoutPreview(activePage.name, result.svg_url, calculateLayoutBounds(activePage));
} else { } else {
if (result.preview_status === 'generated') {
addLog('Layout SVG was not marked ready by the backend.');
}
completeBuildProgress('Layout saved'); completeBuildProgress('Layout saved');
} }
} catch (err) { } catch (err) {
if (buildRequestId !== buildLayoutRequestRef.current) return;
addLog('Save error: ' + err.message); addLog('Save error: ' + err.message);
stopBuildProgress(); stopBuildProgress();
} finally { } finally {
if (buildRequestId === buildLayoutRequestRef.current) { setBuildLayoutBusy(false);
buildLayoutBusyRef.current = false;
setBuildLayoutBusy(false);
}
} }
}, [activePage, buildYamlForPage, currentProjectName, addLog, openLayoutPreview, validateRouteCrossings, startBuildProgress, completeBuildProgress, stopBuildProgress]); }, [activePage, buildLayoutBusy, buildYamlForPage, currentProjectName, addLog, openLayoutPreview, validateRouteCrossings, startBuildProgress, completeBuildProgress, stopBuildProgress]);
// Save YAML for every editable project/composite page without opening previews. // Save YAML for every editable project/composite page without opening previews.
const handleSaveProjectLayouts = useCallback(async () => { const handleSaveProjectLayouts = useCallback(async () => {
@@ -6551,6 +6583,7 @@ ${bundlesBlock}`;
minZoom={0.02} minZoom={0.02}
maxZoom={4} maxZoom={4}
defaultViewport={{ x: 80, y: 80, zoom: 0.12 }} defaultViewport={{ x: 80, y: 80, zoom: 0.12 }}
onMoveEnd={handleCanvasViewportMoveEnd}
panOnDrag={false} panOnDrag={false}
selectionOnDrag={true} selectionOnDrag={true}
selectionMode={FULL_SELECTION_MODE} selectionMode={FULL_SELECTION_MODE}
+3
View File
@@ -61,6 +61,7 @@ assert(
'save-layout response should include an svg_url for the new layout tab' 'save-layout response should include an svg_url for the new layout tab'
); );
assert( assert(
<<<<<<< HEAD
serverPy.includes('svg_ready') && serverPy.includes('svg_ready') &&
serverPy.includes('svg_version') && serverPy.includes('svg_version') &&
serverPy.includes('file_version(svg_path)') && serverPy.includes('file_version(svg_path)') &&
@@ -73,6 +74,8 @@ assert(
'save-layout should publish generated SVG previews atomically instead of serving partially written files' 'save-layout should publish generated SVG previews atomically instead of serving partially written files'
); );
assert( assert(
=======
>>>>>>> jingwen_main
serverPy.includes('RouterStackUnavailable') && serverPy.includes('RouterStackUnavailable') &&
serverPy.includes('except RouterStackUnavailable as e') && serverPy.includes('except RouterStackUnavailable as e') &&
serverPy.includes('"preview_status": preview_status') && serverPy.includes('"preview_status": preview_status') &&
+3
View File
@@ -33,6 +33,7 @@ assert(
'Build Layout should use the backend svg_url response' 'Build Layout should use the backend svg_url response'
); );
assert( assert(
<<<<<<< HEAD
canvasHtml.includes('result.svg_ready && result.svg_url') && canvasHtml.includes('result.svg_ready && result.svg_url') &&
canvasHtml.includes('buildLayoutRequestRef') && canvasHtml.includes('buildLayoutRequestRef') &&
canvasHtml.includes('buildLayoutBusyRef') && canvasHtml.includes('buildLayoutBusyRef') &&
@@ -40,6 +41,8 @@ assert(
'Build Layout should wait for a ready, versioned SVG response and prevent stale duplicate preview updates' 'Build Layout should wait for a ready, versioned SVG response and prevent stale duplicate preview updates'
); );
assert( assert(
=======
>>>>>>> jingwen_main
canvasHtml.includes('result.preview_error') && canvasHtml.includes('result.preview_error') &&
canvasHtml.includes('Preview skipped: '), canvasHtml.includes('Preview skipped: '),
'Build Layout should log when the backend saves YAML but skips SVG preview because the router stack is unavailable' 'Build Layout should log when the backend saves YAML but skips SVG preview because the router stack is unavailable'
+11
View File
@@ -0,0 +1,11 @@
# work log
1.Fixed an issue where switching between different tabs would automatically reset the zoom level.
2.Fixed an port width mismatch in YAML bundles.
3.Fixed the issue where SVG were displaying in incorrect positions.
4.Fixed the abnormal port shift after rotation.
5.Fixed the abnormal position of individual ports.