Cabinet Vision菱形孔网格半循环问题修复方案
菱形孔堆叠图案生成代码的半循环问题与修复
问题背景
我编写了一个循环函数,可基于父对象尺寸和预定义变量(如形状长度、最小边框、间隙距离)生成一排菱形孔,上方一行会缩进,形成类似堆叠桶的图案。但遇到半循环问题:以15英寸高度的对象为例,手动可放置2行孔,但代码无法实现。尝试修改LOOPY、LOOPCUTY变量仅会添加完整循环行,无法生成目标2行。
原核心代码(第一组形状在;***First Row***处生成,第二组缩进形状在;***SecondRow***处生成):
;Modifies Adjustable Shelf For Each S_DSLAB Part IF WINERACKROUTE = NULL THEN WINERACKROUTE = 0 END IF IF WINERACKROUTE = 0 THEN EXIT END IF IF !DIADX THEN DIADX<MEAS> = 4.25 DIADX<STYLE> = 1 DIADX<DESC> = 'DIAMOND SIZE' END IF IF !DIAGAP THEN DIAGAP<MEAS> = 1 DIAGAP<STYLE> = 1 DIAGAP<DESC> = 'DIAMOND SPCING' END IF IF !MINBORDER THEN MINBORDER<MEAS> = .25 MINBORDER<STYLE> = .25 MINBORDER<DESC> = 'MINIMUM BORDER' END IF CROSSDIA = SQRT(2*(DIADX^2)) CROSSGAP = SQRT(2*(DIAGAP^2)) XBORDER = 999 YBORDER = 999 LOOPX = 0 LOOPY = 0 WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPX += 1 XBORDER := ( DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP) )/2 END WHILE WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPY += 1 YBORDER := ( DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP) )/2 END WHILE ;***First Row*** LOOPCUTY := 0 WHILE LOOPCUTY < LOOPY DO LOOPCUTX := 0 LOOPCUTY += 1 WHILE LOOPCUTX < LOOPX DO LOOPCUTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP) DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1)*(CROSSDIA+CROSSGAP) DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE ;***Second Row*** LOOPCUTTY := 0 WHILE LOOPCUTTY < (LOOPY-1) DO LOOPCUTTX := 0 LOOPCUTTY += 1 WHILE LOOPCUTTX < (LOOPX-1) DO LOOPCUTTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE
解决方案说明
通过以下两点调整解决问题:
- 添加尺寸范围判断,对高度在10.75-15.5英寸之间的对象,强制生成2行孔
- 将原代码中的
DY替换为父对象的CAB.DY,并添加Y轴偏移量补偿子部件(下方小基座)的位置偏差,保证孔位整体居中
修复后的完整代码:
For Each S_DSLAB Part IF WINERACKROUTE = NULL THEN WINERACKROUTE = 0 END IF IF WINERACKROUTE = 0 THEN EXIT END IF IF !DIADX THEN DIADX<MEAS> = 4.25 DIADX<STYLE> = 1 DIADX<DESC> = 'DIAMOND SIZE' END IF IF !DIAGAP THEN DIAGAP<MEAS> = 1 DIAGAP<STYLE> = 1 DIAGAP<DESC> = 'DIAMOND SPCING' END IF IF !MINBORDER THEN MINBORDER<MEAS> = .25 MINBORDER<STYLE> = .25 MINBORDER<DESC> = 'MINIMUM BORDER' END IF CROSSDIA = SQRT(2*(DIADX^2)) CROSSGAP = SQRT(2*(DIAGAP^2)) XBORDER = 999 YBORDER = 999 ;------------ cut off bad sizes that dont work IF CAB.DY >= 15.5 or CAB.DY < 10.75 THEN LOOPX = 0 LOOPY = 0 ;------------ started adding + 2*y to compensate for pedestals being smaller than door counterparts for Y positioning WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPX += 1 XBORDER := ( DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP) )/2 END WHILE WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPY += 1 YBORDER := ( CAB.DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP) )/2 + (2*Y) ; YBORDER := ( DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY)*CROSSGAP) )/2 END WHILE LOOPCUTY := 0 WHILE LOOPCUTY < LOOPY DO LOOPCUTX := 0 LOOPCUTY += 1 WHILE LOOPCUTX < LOOPX DO LOOPCUTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230;136 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP) DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1)*(CROSSDIA+CROSSGAP) - (3*Y) DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE LOOPCUTTY := 0 WHILE LOOPCUTTY < (LOOPY-1) DO LOOPCUTTX := 0 LOOPCUTTY += 1 WHILE LOOPCUTTX < (LOOPX-1) DO LOOPCUTTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230 ;136 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 - (3*Y) DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE END IF ;----- isolate off at certain Y heights to force 2 columns of openings IF CAB.DY < 15.5 AND CAB.DY >= 10.75 THEN LOOPX = 0 LOOPY = 0 WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPX += 1 XBORDER := ( DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP) )/2 END WHILE WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO LOOPY += 1 YBORDER := ( :Cab.DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP) )/2 + (2*Y) ; older version: YBORDER := ( DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY)*CROSSGAP) )/2 END WHILE LOOPCUTY := 0 WHILE LOOPCUTY < LOOPY DO LOOPCUTX := 0 LOOPCUTY += 1 WHILE LOOPCUTX < LOOPX DO LOOPCUTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230;136 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP) DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1.25)*(CROSSDIA+CROSSGAP) - (3*Y) DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE LOOPCUTTY := 0 WHILE LOOPCUTTY < (LOOPY) DO LOOPCUTTX := 0 LOOPCUTTY += 1 WHILE LOOPCUTTX < (LOOPX-1) DO LOOPCUTTX += 1 Dim DIAMOND as New ROUTE DIAMOND.TOOLID = 230 ;136 DIAMOND.NAME = 'DIAMOND' DIAMOND.Visible<bool> := True DIAMOND.DX = DIADX DIAMOND.DY = DIADX DIAMOND.DZ = :DZ DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1.25)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 - (3*Y) DIAMOND.Z := 0 DIAMOND.AX<deg> = 0 DIAMOND.AY<deg> = 0 DIAMOND.AZ<deg> = -45 DIAMOND._FACEWP = 1 DIAMOND._RCUT = 0 END WHILE END WHILE END IF
内容的提问来源于stack exchange,提问作者D.Reed
相关产品推荐
相关产品推荐

